Fala pessoal!
Nesse artigo eu queria compartilhar com vocês uma solução simples para desbloquear um usuário sem precisar trocar/resetar a senha, o que às vezes pode ser muito incômodo em ter que alterar a senha de um usuário para que ele volte a logar no banco.

Para saber mais sobre Políticas, Bloqueio e Expiração automáticas, dê uma lida no artigo SQL Server – Políticas de Senhas, Expiração de Senha, Troca de Senha Obrigatória e Bloqueio de Login após N tentativas.

Se você gostou desse conteúdo e quer aprofundar mais na parte de segurança de dados, não deixe de conferir o meu curso Segurança no SQL Server

Quando você cria um login utilizando uma política de senha (CHECK_POLICY) para garantir que as senhas sejam complexas o suficiente e não sejam aceitas senhas curtas e fracas, dependendo das configurações do Windows/AD, o recurso de bloqueio automático após N tentativas incorretas pode estar ativado.

Para testar esse cenário, criaremos um usuário com a política de senha ativada:

USE [master]
GO

CREATE LOGIN [teste_politica_senha] 
WITH 
    PASSWORD = 'BdP@BPptxENu', 
    CHECK_POLICY = ON

Agora garanto que as propriedades de bloqueio automático estejam habilitadas na tela do “Local Security Policy” (secpol.msc)

Bloquearemos esse usuário tentando me conectar mais de 5 vezes (parâmetro que eu defini na tela anterior) com a senha errada

Para verificar se o usuário está bloqueado, você pode utilizar a consulta abaixo:

SELECT
    A.[name],
    A.[type_desc],
    A.is_disabled,
    A.create_date,
    A.modify_date,
    A.is_policy_checked,
    A.is_expiration_checked,
    LOGINPROPERTY(A.[name],'BadPasswordCount') AS [BadPasswordCount],
    LOGINPROPERTY(A.[name],'BadPasswordTime') AS [BadPasswordTime],
    LOGINPROPERTY(A.[name],'DaysUntilExpiration') AS [DaysUntilExpiration],
    LOGINPROPERTY(A.[name],'HistoryLength') AS [HistoryLength],
    LOGINPROPERTY(A.[name],'IsExpired') AS [IsExpired],
    LOGINPROPERTY(A.[name],'IsLocked') AS [IsLocked],
    LOGINPROPERTY(A.[name],'IsMustChange') AS [IsMustChange],
    LOGINPROPERTY(A.[name],'LockoutTime') AS [LockoutTime],
    LOGINPROPERTY(A.[name],'PasswordLastSetTime') AS [PasswordLastSetTime],
    LOGINPROPERTY(A.[name],'PasswordHashAlgorithm') AS [PasswordHashAlgorithm]
FROM 
    sys.sql_logins A
    JOIN sys.server_principals B ON A.[sid] = B.[sid]
WHERE
    A.is_disabled = 0
    AND B.is_fixed_role = 0
    AND LOGINPROPERTY(A.[name],'IsLocked') = 1

Resultado:

Também posso verificar se o Login SQL está bloqueado pela interface do SSMS

Agora vem a dica desse post. Como posso desbloquear esse login sem precisar alterar a senha?

Se você tentar simplesmente desmarcar essa opção na interface do SSMS, irá ver essa mensagem de erro:

Para isso funcionar, desmarque a opção de “Enforce password policy”

Pronto! O usuário já foi desbloqueado. Você já pode marcar essa opção de novo, caso queira manter do jeito que estava antes.

Você também pode utilizar esse comando SQL para desbloquear o usuário sem precisar alterar a senha:

USE [master];
GO

ALTER LOGIN [teste_politica_senha] 
WITH CHECK_POLICY = OFF;
GO

ALTER LOGIN [teste_politica_senha] 
WITH CHECK_POLICY = ON;
GO

E é isso aí!
Post curto e rápido com essa dica útil do dia a dia.
Agora você não precisará trocar a senha do usuário de uma aplicação porque um dev configurou o ambiente errado 🙂