Erro de RDP: desbloquear uma conta Windows bloqueada (PowerShell)
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
- 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. - Desbloqueia a conta indicada em
$Usernameatravés do fornecedor de diretório WinNT. É o equivalente deUnlock-ADAccountpara contas locais. - Ajusta a política, desde que
$ApplyPolicyesteja em$true. Com os valores predefinidos, o bloqueio torna-se menos agressivo; com$LockoutThreshold = 0desliga-o por completo. - 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?
Quanto tempo permanece bloqueada uma conta?
Devo desativar por completo o bloqueio de contas?
Como descubro que endereços IP estão a bloquear a minha conta?
O script não desbloqueia a minha conta, a que se deve?
2026 KernelHost GmbH. Todos os direitos reservados. Este guia está protegido por direitos de autor. A sua republicação noutros sites, na íntegra, em parte ou de forma editada, não é permitida sem o nosso consentimento por escrito. Citações com indicação da fonte e ligação são expressamente bem-vindas.

