Alterando senhas programaticamente

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

Baixar driver OLE DB

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 OLE DB Driver for SQL Driver for SQL Server suporta a gestão programática da expiração da palavra-passe através do OLE DB Driver e 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.

Driver OLE DB para o SQL Server

O OLE DB Driver for SQL Server suporta 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 OLE DB Driver for SQL Server 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 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 OLE DB Driver for SQL Server 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.