Alterando senhas SQL Server Native Client programaticamente

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)

Importante

O SQL Server Native Client (geralmente abreviado como SNAC) foi removido do SQL Server 2022 (16.x) e do SSMS (SQL Server Management Studio) 19. O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Provedor OLE DB herdado da Microsoft para o SQL Server (SQLOLEDB) não são recomendados para um novo desenvolvimento de aplicativo. Alterne para o novo Driver do Microsoft OLE DB para SQL Server (MSOLEDBSQL) ou o Microsoft ODBC Driver for SQL Server mais recente no futuro. Para SQLNCLI que é fornecido como um componente do Mecanismo de Banco de Dados SQL Server (versões 2012 a 2019), consulte esta exceção de Ciclo de Vida de Suporte.

Antes do SQL Server 2005 (9.x), quando a senha de um usuário expirava, somente um administrador poderia redefini-la. A partir do SQL Server 2005 (9.x), o SQL Server Native Client dá suporte ao tratamento de expiração de senha programaticamente por meio do provedor OLE DB SQL Server Native Client e do driver ODBC SQL Server Native Client e por meio de alterações no as caixas de diálogo Logon SQL Server.

Observação

Quando possível, solicite aos usuários que insiram suas credenciais em tempo de execução e que evitem armazená-las em um formato persistente. Caso precise persistir as credenciais, criptografe-as usando a Win32 crypto API. Para obter mais informações sobre o uso de senhas, confira Senhas fortes.

Códigos de erro de logon do SQL Server

Quando não é possível estabelecer uma conexão devido a problemas de autenticação, um dos seguintes códigos de erro do SQL Server estará disponível para o aplicativo, de forma a auxiliar no diagnóstico e na recuperação.

Código de erro do SQL Server Mensagem de erro
15113 Falha no logon do usuário '%.*ls'. Motivo: falha na validação da senha. A conta está bloqueada.
18463 Falha no logon do usuário '%.*ls'. Motivo: falha na alteração da senha. A senha não pode ser usada neste momento.
18464 Falha no logon do usuário '%.*ls'. Motivo: falha na alteração da senha. A senha não atende aos requisitos de política, pois é muito curta.
18465 Falha no logon do usuário '%.*ls'. Motivo: falha na alteração da senha. A senha não atende aos requisitos de política, pois é muito longa.
18466 Falha no logon do usuário '%.*ls'. Motivo: falha na alteração da senha. A senha não atende aos requisitos de política, pois não é complexa o bastante.
18467 Falha no logon do usuário '%.*ls'. Motivo: falha na alteração da senha. A senha não atende aos requisitos da DLL de filtragem de senha.
18468 Falha no logon do usuário '%.*ls'. Motivo: falha na alteração da senha. Ocorreu um erro inesperado durante a validação da senha.
18487 Falha no logon do usuário '%.*ls'. Motivo: a senha da conta expirou.
18488 Falha no logon do usuário '%.*ls'. Motivo: a senha da conta deve ser alterada.

Provedor OLE DB do SQL Server Native Client

O provedor OLE DB SQL Server Native Client dá suporte à expiração de senha por meio de uma interface do usuário e programaticamente.

Expiração de senha da interface do usuário OLE DB

O provedor OLE DB do SQL Server Native Client dá suporte à expiração de senha por meio de alterações feitas nas caixas de diálogo logon do SQL Server. Se o valor de DBPROP_INIT_PROMPT for definido como DBPROMPT_NOPROMPT, a tentativa de conexão inicial irá falhar, caso a senha tenha expirado.

Se DBPROP_INIT_PROMPT tiver sido definido com outro valor, o usuário verá a caixa de diálogo Logon do SQL Server, independentemente de a senha ter expirado ou não. O usuário pode clicar no botão Opções e marcar Alterar Senha para alterar a senha.

Se o usuário clicar em OK e a senha tiver expirado, o SQL Server solicitará que o usuário insira e confirme uma nova senha usando a caixa de diálogo Alterar Senha do SQL Server.

Contas bloqueadas e comportamento do prompt do OLE DB

As tentativas de conexão podem falhar devido ao bloqueio da conta. Se isso ocorrer após a exibição da caixa de diálogo Logon do SQL Server, a mensagem de erro do servidor será exibida para o usuário e a tentativa de conexão será anulada. Isso também poderá ocorrer após a exibição da caixa de diálogo Alterar Senha do SQL Server se o usuário inserir um valor incorreto para a senha antiga. Neste caso, a mesma mensagem de erro será exibida e a tentativa de conexão será anulada.

Contas bloqueadas, expiração de senha e pool de conexão do OLE DB

Uma conta pode ser bloqueada ou sua senha pode expirar enquanto a conexão ainda está ativa em um pool de conexão. O servidor verifica senhas expiradas e contas bloqueadas em duas ocasiões. A primeiro ao criar uma conexão pela primeira vez. A segunda ocasião é ao redefinir a conexão, quando ela é tirada do pool.

Quando a tentativa de redefinição falha, a conexão é removida do pool e um erro é retornado.

Expiração de senha programática do OLE DB

O provedor OLE DB SQL Server Native Client dá suporte à expiração de senha por meio da adição da propriedade SSPROP_AUTH_OLD_PASSWORD (tipo VT_BSTR) que foi adicionada ao conjunto de propriedades DBPROPSET_SQLSERVERDBINIT.

A propriedade "Password" existente referencia DBPROP_AUTH_PASSWORD e é usada para armazenar a nova senha.

Observação

Na cadeia de conexão, a propriedade "Old Password" define SSPROP_AUTH_OLD_PASSWORD, que é a senha atual (provavelmente expirada) que não está disponível por meio de uma propriedade de cadeia de caracteres do provedor.

O provedor não mantém o valor desta propriedade. Quando esta propriedade é definida, o provedor não usa o pool de conexão na primeira conexão, pois ocorrerá uma nova conexão. Se a alteração da senha tiver êxito, não será possível reutilizar a conexão atual, pois ela ainda conterá a senha antiga, que será inválida após a alteração da senha. Além disso, se o logon for bem-sucedido, o provedor limpará essa propriedade. As tentativas subsequentes de recuperar a senha antiga retornarão VT_EMPTY.

Observação

SSPROP_AUTH_OLD_PASSWORD nunca deve ser mantido, pois ele é usado somente quando uma senha expirou.

Sempre que a propriedade "Old Password" é definida, o provedor supõe que está sendo feita uma tentativa de alterar a senha, a menos que a Autenticação do Windows também seja especificada; nesse caso, ela sempre terá precedência.

Se a Autenticação do Windows for usada, a especificação da senha antiga resultará em DB_E_ERRORSOCCURRED ou DB_S_ERRORSOCCURRED, dependendo de a senha antiga ter sido especificada como REQUIRED ou OPTIONAL, respectivamente, e o valor de status de DBPROPSTATUS_CONFLICTINGBADVALUE será retornado em dwStatus. Isto é detectado quando IDBInitialize::Initialize é chamado.

Se uma tentativa de alterar a senha falhar inesperadamente, o servidor retornará o código de erro 18468. Um erro OLEDB padrão é retornado da tentativa de conexão.

Para obter mais informações sobre o conjunto de propriedades DBPROPSET_SQLSERVERDBINIT, confira Propriedades de inicialização e autorização.

Driver ODBC do SQL Server Native Client

O provedor OLE DB SQL Server Native Client dá suporte à expiração de senha por meio de uma interface do usuário e programaticamente.

Expiração de senha da interface do usuário ODBC

O driver ODBC do SQL Server Native Client dá suporte à expiração de senha por meio de alterações feitas nas caixas de diálogo logon do SQL Server.

Se SQLDriverConnect for chamado e o valor de DriverCompletion estiver definido como SQL_DRIVER_NOPROMPT, a tentativa de conexão inicial falhará se a senha tiver expirado. O valor SQLSTATE 28000 e o valor do código de erro nativo 18487 são retornados por chamadas subsequentes para SQLError ou SQLGetDiagRec.

Se DriverCompletion tiver sido definido como qualquer outro valor, o usuário verá a caixa de diálogo SQL Server Logon, independentemente de a senha ter expirado ou não. O usuário pode clicar no botão Opções e marcar Alterar Senha para alterar a senha.

Se o usuário clicar em OK e a senha tiver expirado, SQL Server solicitará que insira e confirme uma nova senha usando a caixa de diálogo Alterar senha SQL Server.

Contas bloqueadas e comportamento do prompt do ODBC

As tentativas de conexão podem falhar devido ao bloqueio da conta. Se isso ocorrer após a exibição da caixa de diálogo Logon do SQL Server, a mensagem de erro do servidor será exibida para o usuário e a tentativa de conexão será anulada. Isso também poderá ocorrer após a exibição da caixa de diálogo Alterar Senha do SQL Server se o usuário inserir um valor incorreto para a senha antiga. Neste caso, a mesma mensagem de erro será exibida e a tentativa de conexão será anulada.

Contas bloqueadas, expiração de senha e pool de conexão do ODBC

Uma conta pode ser bloqueada ou sua senha pode expirar enquanto a conexão ainda está ativa em um pool de conexão. O servidor verifica senhas expiradas e contas bloqueadas em duas ocasiões. A primeiro ao criar uma conexão pela primeira vez. A segunda ocasião é ao redefinir a conexão, quando ela é tirada do pool.

Quando a tentativa de redefinição falha, a conexão é removida do pool e um erro é retornado.

Expiração de senha programática do ODBC

O driver ODBC SQL Server Native Client dá suporte à expiração de senha por meio da adição do atributo SQL_COPT_SS_OLDPWD que é definido antes de se conectar ao servidor usando a função SQLSetConnectAttr.

O atributo SQL_COPT_SS_OLDPWD do identificador de conexão referencia a senha expirada. Não há nenhum atributo de cadeia de conexão para esse atributo, pois isto interferiria com o pool de conexão. Se o logon tiver êxito, o driver limpará esse atributo.

O driver ODBC SQL Server Native Client retorna SQL_ERROR em quatro casos para esse recurso: expiração de senha, conflito de política de senha, bloqueio de conta e quando a propriedade de senha antiga é definida durante o uso da Autenticação do Windows. O driver retorna as mensagens de erro apropriadas para o usuário quando SQLGetDiagField é invocado.

Consulte Também

Recursos do SQL Server Native Client