Alteração Programática das Palavras-passe Nativas do SQL Server

Aplica-se a: SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)

Importante

SQL Server Native Client (SNAC) não é fornecido com:

  • SQL Server 2022 (16.x) e versões posteriores
  • SQL Server Management Studio 19 e versões posteriores

O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Microsoft OLE DB Provider for SQL Server (SQLOLEDB) herdado não são recomendados para o desenvolvimento de novos aplicativos.

Para novos projetos, use um dos seguintes drivers:

Para o SQLNCLI fornecido como componente do Mecanismo de Base de Dados do SQL Server (versões de 2012 a 2019), consulte esta exceção ao Ciclo de Vida de Suporte .

Antes do SQL Server 2005 (9.x), quando a palavra-passe de um utilizador expirava, apenas um administrador podia redefini-la. A partir do SQL Server 2005 (9.x), o SQL Server Native Client suporta a gestão da expiração da palavra-passe de forma programática através do fornecedor OLE DB do SQL Server Native Client e do driver ODBC do SQL Server Native Client, bem como através de alterações nas caixas de diálogo de login do SQL Server.

Note

Sempre que possível, incentive os utilizadores a introduzirem as suas credenciais em tempo de execução e evite armazená-las num formato persistente. Se tiver de manter as credenciais deles, deve encriptá-las usando a API criptográfica Win32. Para mais informações sobre o uso de palavras-passe, consulte Palavras-passe Fortes.

Códigos de Erro de Login do SQL Server

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

Código de Erro do SQL Server Mensagem de erro
15113 Falha de login para o utilizador '%.*ls' Motivo: Falha na validação da palavra-passe. A conta está bloqueada.
18463 Falha de login para o usuário '%.*ls'. Motivo: Falha na alteração da senha. A senha não pode ser usada no momento.
18464 Falha de login para o usuário '%.*ls'. Motivo: Falha na alteração da senha. A senha não atende aos requisitos da política porque é muito curta.
18465 Falha de login para o usuário '%.*ls'. Motivo: Falha na alteração da senha. A palavra-passe não cumpre os requisitos da política porque é demasiado longa.
18466 Falha de login para o usuário '%.*ls'. Motivo: Falha na alteração da senha. A senha não atende aos requisitos da política porque não é complexa o suficiente.
18467 Falha de login para o usuário '%.*ls'. Motivo: Falha na alteração da senha. A senha não atende aos requisitos da DLL do filtro de senha.
18468 Falha de login para o usuário '%.*ls'. Motivo: Falha na alteração da senha. Ocorreu um erro inesperado durante a validação da palavra-passe.
18487 Falha de login para o usuário '%.*ls'. Motivo: a palavra-passe da conta expirou.
18488 Falha de login para o usuário '%.*ls'. Motivo: A senha da conta deve ser alterada.

Fornecedor SQL Server Native Client OLE DB

O fornecedor SQL Server Native Client OLE DB suporta a expiração de palavra-passe através de uma interface de utilizador e programaticamente.

Expiração da Palavra-passe da Interface de Utilizador do OLE DB

O fornecedor SQL Server Native Client OLE DB suporta a expiração da palavra-passe através de alterações feitas às caixas de diálogo de login do SQL Server. Se o valor de DBPROP_INIT_PROMPT estiver definido para DBPROMPT_NOPROMPT, a tentativa inicial de ligação falhará se a palavra-passe tiver expirado.

Se DBPROP_INIT_PROMPT tiver sido definido para qualquer outro valor, o utilizador vê o diálogo de SQL Server Login, independentemente de a palavra-passe ter expirado ou não. O utilizador pode clicar no botão Opções e marcar Alterar Palavra-passe para alterar a palavra-passe.

Se o utilizador clicar em OK e a palavra-passe expirar, o SQL Server pede ao utilizador que introduza e confirme uma nova palavra-passe usando o diálogo Change SQL Server Password.

Comportamento de Prompts do OLE DB e Contas Bloqueadas

As tentativas de ligação podem falhar devido ao bloqueio da conta. Se isto ocorrer após a visualização do diálogo Login do SQL Server, a mensagem de erro do servidor é apresentada ao utilizador e a tentativa de ligação é abortada. Também pode ocorrer após a exibição do diálogo Change SQL Server Password se o utilizador introduzir um valor incorreto para a palavra-passe antiga. Neste caso, a mesma mensagem de erro é exibida e a tentativa de ligação é abortada.

Pooling de Ligações OLE DB, Expiração de Palavras-Passe e Contas Bloqueadas

Uma conta pode ser bloqueada ou a sua palavra-passe pode expirar enquanto a ligação ainda estiver ativa num pool de ligações. O servidor verifica passwords expiradas e contas bloqueadas em duas ocasiões. A primeira é quando uma ligação é criada pela primeira vez. A segunda ocasião é ao reiniciar a ligação, quando a ligação é retirada do pool.

Quando a tentativa de reset falha, a ligação é removida do pool e um erro é devolvedo.

Expiração da Palavra-passe Programática do OLE DB

O fornecedor SQL Server Native Client OLE DB suporta a expiração da palavra-passe através da adição da propriedade SSPROP_AUTH_OLD_PASSWORD (tipo VT_BSTR) que foi adicionada ao conjunto de propriedades DBPROPSET_SQLSERVERDBINIT.

A propriedade existente "Password" refere-se a DBPROP_AUTH_PASSWORD e é usada para armazenar a nova palavra-passe.

Note

No cadeia de ligação, a propriedade "Palavra-passe Antiga" define SSPROP_AUTH_OLD_PASSWORD, que é a palavra-passe atual (possivelmente expirada) que não está disponível através de uma propriedade de cadeia de fornecedor.

O fornecedor não mantém o valor desta propriedade. Quando esta propriedade é definida, o fornecedor não utiliza o pool de ligações para a primeira ligação porque ocorrerá uma nova ligação. Se a alteração da palavra-passe for bem-sucedida, a ligação atual não pode ser reutilizada, pois ainda contém a palavra-passe antiga, que será inválida após a alteração. Além disso, se o login for bem-sucedido, o fornecedor limpa essa propriedade. As tentativas subsequentes de recuperar a palavra-passe antiga retornam VT_EMPTY.

Note

SSPROP_AUTH_OLD_PASSWORD nunca deve ser mantido, pois só é usado quando uma palavra-passe expirou.

Note que sempre que a propriedade "Palavra-passe Antiga" é definida, o fornecedor assume que está a ser feita uma tentativa de alteração da palavra-passe, a menos que a Autenticação Windows também seja especificada, caso em que tem sempre prioridade.

Se for usada Windows Autenticação, especificar a palavra-passe antiga resulta em DB_E_ERRORSOCCURRED ou DB_S_ERRORSOCCURRED dependendo se a palavra-passe antiga foi especificada como OBRIGATÓRIA ou OPCIONAL, respetivamente, e o valor de estado da DBPROPSTATUS_CONFLICTINGBADVALUE é devolvido em dwStatus. Isto é detetado quando o IDBInitialize::Initialize é chamado.

Se uma tentativa de alterar a palavra-passe falhar inesperadamente, o servidor devolve o código de erro 18468. Um erro padrão OLEDB é devolvido na tentativa de ligação.

Para mais informações sobre o conjunto de propriedades DBPROPSET_SQLSERVERDBINIT, consulte Propriedades de Inicialização e Autorização.

Driver ODBC de Cliente Nativo do SQL Server

O fornecedor SQL Server Native Client OLE DB suporta a expiração de palavra-passe através de uma interface de utilizador e programaticamente.

Expiração da Palavra-passe da Interface de Utilizador ODBC

O driver SQL Server Native Client ODBC suporta a expiração da palavra-passe através de alterações feitas nas caixas de diálogo de login do SQL Server.

Se o SQLDriverConnect for chamado e o valor de DriverCompletion for definido para SQL_DRIVER_NOPROMPT, a tentativa inicial de ligação falha se a palavra-passe tiver expirado. O valor SQLSTATE 28000 e o valor nativo do código de erro 18487 são devolvidos por chamadas subsequentes para SQLError ou SQLGetDiagRec.

Se o DriverCompletion tiver sido definido para qualquer outro valor, o utilizador vê a janela de diálogo Login do SQL Server, independentemente de a palavra-passe ter expirado ou não. O utilizador pode clicar no botão Opções e marcar Alterar Palavra-passe para alterar a palavra-passe.

Se o utilizador clicar em OK e a palavra-passe expirar, o SQL Server pede para introduzir e confirmar uma nova palavra-passe usando o diálogo Change SQL Server Password.

Comportamento de Prompts ODBC e Contas Bloqueadas

As tentativas de ligação podem falhar devido ao bloqueio da conta. Se isto ocorrer após a visualização do diálogo Login do SQL Server, a mensagem de erro do servidor é apresentada ao utilizador e a tentativa de ligação é abortada. Também pode ocorrer após a exibição do diálogo Change SQL Server Password se o utilizador introduzir um valor incorreto para a palavra-passe antiga. Neste caso, a mesma mensagem de erro é exibida e a tentativa de ligação é abortada.

Pooling de Ligações ODBC, Expiração de Palavra-passe e Contas Bloqueadas

Uma conta pode ser bloqueada ou a sua palavra-passe pode expirar enquanto a ligação ainda estiver ativa num pool de ligações. O servidor verifica passwords expiradas e contas bloqueadas em duas ocasiões. A primeira é quando uma ligação é criada pela primeira vez. A segunda ocasião é ao reiniciar a ligação, quando a ligação é retirada do pool.

Quando a tentativa de reset falha, a ligação é removida do pool e um erro é devolvedo.

Expiração da Palavra-passe Programática ODBC

O driver ODBC SQL Server Native Client suporta a expiração da palavra-passe através da adição do atributo SQL_COPT_SS_OLDPWD, que é definido antes de se ligar ao servidor usando a função SQLSetConnectAttr.

O atributo SQL_COPT_SS_OLDPWD do handle de ligação refere-se à palavra-passe expirada. Não existe um atributo cadeia de ligação para este atributo, pois interferiria com o pool de conexões. Se o login for bem-sucedido, o driver limpa este atributo.

O driver ODBC do SQL Server Native Client devolve SQL_ERROR em quatro casos para esta funcionalidade: expiração da palavra-passe, conflito de política de palavra-passe, bloqueio da conta e quando a propriedade da palavra-passe antiga é definida ao usar Windows Autenticação. O driver devolve as mensagens de erro apropriadas ao utilizador quando o SQLGetDiagField é invocado.