Erro de RDP: desbloquear uma conta Windows bloqueada (PowerShell)

Publicado a Atualizado a 7 min de leitura

Uma conta Windows bloqueada no início de sessão RDP é quase sempre consequência de ataques automatizados. Este script PowerShell desbloqueia a conta, mostra os IP de origem e ajusta a política de bloqueio.

O seu início de sessão por Ambiente de Trabalho Remoto falha de repente e o Windows apresenta uma mensagem deste género: "Por motivos de segurança, a conta de utilizador foi bloqueada, porque foram efetuadas demasiadas tentativas de início de sessão ou de alteração de palavra-passe." Nesse caso, a conta acionou a política de bloqueio de contas do Windows. A causa é quase sempre a mesma: alguém ou alguma coisa bombardeou o seu acesso RDP com tentativas de início de sessão a partir da Internet.

Neste guia mostramos-lhe como desbloquear a conta, descobrir que endereços IP estão a provocar os bloqueios e ajustar ou desativar a política de bloqueio. Tudo isto é tratado por um único script PowerShell, sem qualquer clique no editor de políticas de grupo.

Porque é que uma conta Windows fica bloqueada no início de sessão RDP?

O Windows conta as tentativas de início de sessão falhadas e bloqueia a conta assim que o limiar definido é atingido. Esta função de proteção faz sentido, mas passa a ser um problema logo que a porta RDP fica aberta na Internet: bots automatizados experimentam então palavras-passe a toda a hora e bloqueiam justamente a conta com que pretende trabalhar.

Três valores determinam este comportamento:

  • Limiar de bloqueio: número de tentativas falhadas até ao bloqueio
  • Duração do bloqueio: minutos durante os quais a conta permanece bloqueada
  • Janela de observação: minutos ao longo dos quais as tentativas falhadas são somadas

Abrir o PowerShell como administrador

Abra o Windows PowerShell como administrador. Para isso, clique com o botão direito do rato em "Windows PowerShell" no menu Iniciar e escolha "Executar como administrador". Sem direitos elevados, o script não consegue desbloquear a conta nem alterar a política.

O script: desbloquear a conta e expor os atacantes

Ajuste o nome da conta e os valores pretendidos na secção "Definições" e cole depois o script no PowerShell:

#Requires -RunAsAdministrator

# KernelHost: desbloquear uma conta Windows RDP bloqueada e encontrar a causa
# Executar no Windows PowerShell como administrador.

# ----------------------------------------------------------------------------
#  Definições: adapte ao seu ambiente
# ----------------------------------------------------------------------------
$Username = 'Administrator'   # a conta local que deve ser desbloqueada

$ApplyPolicy      = $true     # $false para manter a política de bloqueio inalterada
$LockoutThreshold = 10        # tentativas falhadas até ao bloqueio (0 = DESATIVAR o bloqueio)
$LockoutDuration  = 15        # minutos durante os quais a conta permanece bloqueada
$LockoutWindow    = 15        # minutos ao longo dos quais as tentativas falhadas são contadas
# ----------------------------------------------------------------------------

# 1) Mostrar a política de bloqueio atual
Write-Host "`n=== 1) Política de bloqueio atual ===" -ForegroundColor Cyan
net accounts | Select-String 'Lockout|Sperr'

# 2) Desbloquear a conta
Write-Host "`n=== 2) Desbloquear a conta '$Username' ===" -ForegroundColor Cyan
try {
    $user = [ADSI]"WinNT://$env:COMPUTERNAME/$Username,user"
    if ($user.InvokeGet('IsAccountLocked')) {
        $user.InvokeSet('IsAccountLocked', $false)
        $user.SetInfo()
        Write-Host "  '$Username' estava bloqueada e está agora DESBLOQUEADA." -ForegroundColor Green
    } else {
        Write-Host "  '$Username' não está bloqueada." -ForegroundColor Yellow
    }
} catch {
    Write-Warning "  Não foi possível desbloquear '$Username': $($_.Exception.Message)"
}

# 3) Opcional: ajustar ou desativar a política de bloqueio
if ($ApplyPolicy) {
    Write-Host "`n=== 3) Definir a política de bloqueio ===" -ForegroundColor Cyan
    if ($LockoutThreshold -eq 0) {
        net accounts /lockoutthreshold:0 | Out-Null
        Write-Host "  Bloqueio de contas DESATIVADO (limiar 0)." -ForegroundColor Yellow
        Write-Warning "  Num servidor acessível a partir da Internet, isto NÃO é recomendado."
    } else {
        net accounts /lockoutthreshold:$LockoutThreshold /lockoutduration:$LockoutDuration /lockoutwindow:$LockoutWindow | Out-Null
        Write-Host "  Limiar=$LockoutThreshold  Duração=$LockoutDuration min  Janela=$LockoutWindow min" -ForegroundColor Green
    }
}

# 4) Quem provoca os bloqueios? (origens dos ataques RDP)
Write-Host "`n=== 4a) Últimos eventos de bloqueio (Security-ID 4740) ===" -ForegroundColor Cyan
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 10 -ErrorAction SilentlyContinue |
    ForEach-Object {
        $x = [xml]$_.ToXml()
        [pscustomobject]@{
            Hora           = $_.TimeCreated
            ContaBloqueada = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
            Origem         = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetDomainName' }).'#text'
        }
    } | Format-Table -AutoSize

Write-Host "=== 4b) IPs de origem mais frequentes de inícios de sessão falhados, últimas 24h (Security-ID 4625) ===" -ForegroundColor Cyan
$since = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=$since} -ErrorAction SilentlyContinue |
    ForEach-Object {
        ([xml]$_.ToXml()).Event.EventData.Data |
            Where-Object { $_.Name -eq 'IpAddress' } | Select-Object -ExpandProperty '#text'
    } |
    Where-Object { $_ -and $_ -ne '-' } |
    Group-Object | Sort-Object Count -Descending | Select-Object -First 10 |
    Format-Table Count, @{N='IPOrigem'; E={$_.Name}} -AutoSize

O que o script faz em detalhe

  1. Mostra, através de net accounts, a política de bloqueio de contas atual, ou seja, o limiar, a duração do bloqueio e a janela de observação.
  2. Desbloqueia a conta indicada em $Username através do fornecedor de diretório WinNT. É o equivalente de Unlock-ADAccount para contas locais.
  3. Ajusta a política, desde que $ApplyPolicy esteja em $true. Com os valores predefinidos, o bloqueio torna-se menos agressivo; com $LockoutThreshold = 0 desliga-o por completo.
  4. Lista os últimos eventos de bloqueio (ID de evento 4740) e os endereços IP de origem mais frequentes das tentativas de início de sessão falhadas nas últimas 24 horas (ID de evento 4625). São esses os endereços a partir dos quais o seu acesso RDP está a ser atacado.

Nota sobre o idioma: num Windows em alemão, net accounts apresenta os valores com etiquetas traduzidas. Por isso o script acima filtra tanto por "Lockout" como por "Sperr". Num sistema em português, acrescente "Bloqueio" ao padrão de pesquisa.

Conta local ou conta de domínio?

O script dirige-se a uma conta local, ou seja, o caso típico num vServer ou servidor root autónomo. Se se tratar de uma conta de domínio, ou se estiver a trabalhar num controlador de domínio, desbloqueie antes a conta assim:

Unlock-ADAccount -Identity <nome_utilizador>

Ajustar ou desativar o limiar de bloqueio

Com $LockoutThreshold = 0 desliga por completo a proteção por bloqueio. Num servidor acessível a partir da Internet, desaconselhamos essa opção: sem bloqueio, um atacante pode experimentar quantas palavras-passe quiser. Mais sensato é um limiar moderado, cerca de 10 tentativas falhadas, combinado com as medidas da secção seguinte.

Eliminar a causa: proteger o RDP de forma duradoura

Uma conta bloqueada é apenas o sintoma. A verdadeira causa é um acesso RDP aberto a toda a Internet. Estas quatro medidas resolvem o problema pela raiz.

Limitar o RDP ao seu próprio endereço IP

Esta é, de longe, a medida mais eficaz. Se o RDP só continuar acessível a partir do seu próprio endereço, todos os ataques automatizados caem no vazio:

# Permitir RDP de entrada apenas a partir do seu próprio endereço IP
Set-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (TCP-In)' -RemoteAddress '203.0.113.5'

O nome de apresentação indicado aqui vale para um Windows em inglês. Num sistema localizado, tanto em português como em alemão, o nome é diferente. Pode listar as regras existentes e os seus nomes exatos com Get-NetFirewallRule -DisplayGroup 'Remotedesktop'.

Bloquear um endereço IP de atacante concreto

Para os endereços que o passo 4b do script lhe apresenta, crie uma regra de bloqueio dirigida:

New-NetFirewallRule -DisplayName 'Block RDP attacker 203.0.113.9' -Direction Inbound -Action Block -RemoteAddress '203.0.113.9'

Isto ajuda contra algumas origens persistentes, mas não substitui a restrição ao seu próprio endereço IP, porque os atacantes usam constantemente endereços novos.

Alterar a porta do RDP

Se o RDP deixar de escutar na porta padrão 3389, os habituais scans em massa nem sequer encontram o seu serviço. Como alterar a porta sem reiniciar o servidor é explicado no nosso guia Alterar a porta RDP no Windows sem reiniciar.

Palavra-passe forte e Network Level Authentication

Utilize uma palavra-passe longa e aleatória e mantenha a Network Level Authentication (NLA) ativada. A NLA exige a autenticação antes de sequer ser estabelecida uma sessão e afasta assim, logo à partida, grande parte das tentativas automatizadas.

Perguntas frequentes

Porque é que a minha conta Windows fica bloqueada no início de sessão RDP?
O Windows bloqueia uma conta assim que é atingido o número de tentativas de início de sessão falhadas definido na política de bloqueio. Num servidor com a porta RDP aberta na Internet, esse bloqueio é quase sempre provocado por ataques automatizados.
Quanto tempo permanece bloqueada uma conta?
Tanto tempo quanto a duração de bloqueio configurada indicar, muitas vezes 15 ou 30 minutos. Depois disso, o início de sessão volta a ser possível. Com o script deste guia também levanta o bloqueio de imediato.
Devo desativar por completo o bloqueio de contas?
Num servidor acessível ao público, é melhor não o fazer. Sem bloqueio, um atacante pode experimentar quantas palavras-passe quiser. Mais sensato é um limiar moderado de cerca de 10 tentativas, em conjunto com uma regra de firewall que limite o RDP ao seu próprio endereço IP.
Como descubro que endereços IP estão a bloquear a minha conta?
O ID de evento 4740 no registo de segurança documenta os próprios bloqueios e o ID de evento 4625 as tentativas de início de sessão falhadas, incluindo o IP de origem. O script deste guia analisa ambos automaticamente.
O script não desbloqueia a minha conta, a que se deve?
O script dirige-se a uma conta local. No caso de uma conta de domínio, ou num controlador de domínio, desbloqueie antes com o Unlock-ADAccount. Verifique também se o PowerShell está mesmo a correr como administrador.

Windows Server Windows RDP Remote Desktop PowerShell Bloqueio de contas Força bruta Segurança do servidor