Errore RDP: sbloccare un account Windows bloccato (PowerShell)
Un account Windows bloccato all'accesso RDP è di solito la conseguenza di attacchi automatici. Questo script PowerShell sblocca l'account, mostra gli IP di origine e adatta il criterio di blocco.
La tua connessione Desktop remoto smette all'improvviso di funzionare e Windows segnala qualcosa del tipo: "Per motivi di sicurezza l'account utente è stato bloccato perché sono stati effettuati troppi tentativi di accesso o di modifica della password." Vuol dire che l'account ha fatto scattare il criterio di blocco account di Windows. La causa è quasi sempre la stessa: qualcuno o qualcosa sta bombardando il tuo accesso RDP con tentativi di accesso da Internet.
In questa guida ti mostriamo come sbloccare l'account, scoprire quali indirizzi IP provocano i blocchi e adattare o disattivare il criterio di blocco. Di tutto questo si occupa un unico script PowerShell, senza dover cliccare nell'editor dei criteri di gruppo.
Perché un account Windows viene bloccato durante l'accesso RDP?
Windows conta i tentativi di accesso falliti e blocca l'account non appena viene raggiunta la soglia configurata. Questa protezione ha senso, ma diventa un problema nel momento in cui la porta RDP resta aperta su Internet: i bot automatici provano password 24 ore su 24 e bloccano proprio l'account con cui vuoi lavorare tu.
Tre valori determinano questo comportamento:
- Soglia di blocco: numero di tentativi falliti prima del blocco
- Durata del blocco: minuti per cui l'account resta bloccato
- Finestra di osservazione: minuti su cui vengono sommati i tentativi falliti
Aprire PowerShell come amministratore
Apri Windows PowerShell come amministratore. Nel menu Start fai clic con il tasto destro su "Windows PowerShell" e scegli "Esegui come amministratore". Senza diritti elevati lo script non può né sbloccare l'account né modificare il criterio.
Lo script: sbloccare l'account e smascherare chi attacca
Nella sezione "Impostazioni" adatta il nome dell'account e i valori che vuoi usare, poi incolla lo script in PowerShell:
#Requires -RunAsAdministrator
# KernelHost: sbloccare un account Windows RDP bloccato e trovare la causa
# Da eseguire in Windows PowerShell come amministratore.
# ----------------------------------------------------------------------------
# Impostazioni: da adattare al tuo ambiente
# ----------------------------------------------------------------------------
$Username = 'Administrator' # l'account locale da sbloccare
$ApplyPolicy = $true # $false per lasciare invariato il criterio di blocco
$LockoutThreshold = 10 # tentativi falliti prima del blocco (0 = DISATTIVA il blocco)
$LockoutDuration = 15 # minuti per cui l'account resta bloccato
$LockoutWindow = 15 # minuti su cui vengono contati i tentativi falliti
# ----------------------------------------------------------------------------
# 1) Mostrare il criterio di blocco attuale
Write-Host "`n=== 1) Criterio di blocco attuale ===" -ForegroundColor Cyan
net accounts | Select-String 'Lockout|Sperr'
# 2) Sbloccare l'account
Write-Host "`n=== 2) Sbloccare l'account '$Username' ===" -ForegroundColor Cyan
try {
$user = [ADSI]"WinNT://$env:COMPUTERNAME/$Username,user"
if ($user.InvokeGet('IsAccountLocked')) {
$user.InvokeSet('IsAccountLocked', $false)
$user.SetInfo()
Write-Host " '$Username' era bloccato ed è ora SBLOCCATO." -ForegroundColor Green
} else {
Write-Host " '$Username' non è bloccato." -ForegroundColor Yellow
}
} catch {
Write-Warning " Impossibile sbloccare '$Username': $($_.Exception.Message)"
}
# 3) Facoltativo: adattare o disattivare il criterio di blocco
if ($ApplyPolicy) {
Write-Host "`n=== 3) Impostare il criterio di blocco ===" -ForegroundColor Cyan
if ($LockoutThreshold -eq 0) {
net accounts /lockoutthreshold:0 | Out-Null
Write-Host " Blocco account DISATTIVATO (soglia 0)." -ForegroundColor Yellow
Write-Warning " Su un server raggiungibile pubblicamente questo NON è consigliato."
} else {
net accounts /lockoutthreshold:$LockoutThreshold /lockoutduration:$LockoutDuration /lockoutwindow:$LockoutWindow | Out-Null
Write-Host " Soglia=$LockoutThreshold Durata=$LockoutDuration min Finestra=$LockoutWindow min" -ForegroundColor Green
}
}
# 4) Chi provoca i blocchi? (origine degli attacchi RDP)
Write-Host "`n=== 4a) Ultimi eventi di blocco (Security-ID 4740) ===" -ForegroundColor Cyan
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 10 -ErrorAction SilentlyContinue |
ForEach-Object {
$x = [xml]$_.ToXml()
[pscustomobject]@{
Ora = $_.TimeCreated
AccountBloccato = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
Origine = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetDomainName' }).'#text'
}
} | Format-Table -AutoSize
Write-Host "=== 4b) IP di origine più frequenti degli accessi falliti, ultime 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='IPOrigine'; E={$_.Name}} -AutoSize
Che cosa fa lo script nel dettaglio
- Con
net accountsmostra il criterio di blocco account attuale, quindi soglia, durata del blocco e finestra di osservazione. - Sblocca l'account indicato in
$Usernametramite il provider di directory WinNT. È l'equivalente diUnlock-ADAccountper gli account locali. - Adatta il criterio, a patto che
$ApplyPolicysia impostato su$true. Con i valori predefiniti il blocco diventa meno aggressivo, mentre con$LockoutThreshold = 0lo disattivi del tutto. - Elenca gli ultimi eventi di blocco (ID evento 4740) e gli indirizzi IP di origine più frequenti degli accessi falliti nelle ultime 24 ore (ID evento 4625). Sono gli indirizzi da cui il tuo accesso RDP viene attaccato.
Nota sulla lingua: su un Windows localizzato net accounts stampa i valori con etichette tradotte. Per questo lo script qui sopra filtra sia su "Lockout" sia su "Sperr". Su un sistema in italiano aggiungi "Blocco" al criterio di ricerca.
Account locale o account di dominio?
Lo script si rivolge a un account locale, cioè il caso tipico su un VPS o un server root a sé stante. Se si tratta di un account di dominio, oppure se lavori su un controller di dominio, sbloccalo invece così:
Unlock-ADAccount -Identity <nome_utente>
Adattare o disattivare la soglia di blocco
Con $LockoutThreshold = 0 disattivi completamente la protezione tramite blocco. Su un server raggiungibile da Internet te lo sconsigliamo: senza blocco chi attacca può provare quante password vuole. Ha più senso una soglia moderata, intorno ai 10 tentativi falliti, combinata con le misure della sezione successiva.
Eliminare la causa: mettere in sicurezza RDP in modo duraturo
Un account bloccato è solo il sintomo. La causa vera è un accesso RDP aperto a tutta Internet. Queste quattro misure affrontano il problema alla radice.
Limitare RDP al proprio indirizzo IP
È di gran lunga la misura più efficace. Se RDP è raggiungibile soltanto dal tuo indirizzo, tutti gli attacchi automatici finiscono nel vuoto:
# Consentire l'RDP in ingresso solo dal proprio indirizzo IP
Set-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (TCP-In)' -RemoteAddress '203.0.113.5'
Il nome visualizzato indicato qui vale per un Windows in inglese. Su un sistema localizzato, in italiano come in tedesco, è diverso. Puoi elencare le regole esistenti con i loro nomi esatti tramite Get-NetFirewallRule -DisplayGroup 'Remotedesktop'.
Bloccare il singolo IP di chi attacca
Per gli indirizzi che il passo 4b dello script ti restituisce, crea una regola di blocco mirata:
New-NetFirewallRule -DisplayName 'Block RDP attacker 203.0.113.9' -Direction Inbound -Action Block -RemoteAddress '203.0.113.9'
Aiuta contro singole fonti particolarmente insistenti, ma non sostituisce la limitazione al tuo indirizzo IP, perché chi attacca cambia indirizzo di continuo.
Cambiare la porta RDP
Se RDP non è più in ascolto sulla porta predefinita 3389, le solite scansioni di massa non trovano nemmeno il tuo servizio. Come cambiare la porta senza riavviare il server te lo spiega la nostra guida Cambiare la porta RDP su Windows senza riavviare il server.
Password robusta e Network Level Authentication
Usa una password lunga e casuale e lascia attiva la Network Level Authentication (NLA). La NLA richiede l'autenticazione prima ancora che venga stabilita una sessione e respinge così in anticipo buona parte dei tentativi automatici.
Domande frequenti
Perché il mio account Windows viene bloccato all'accesso RDP?
Quanto resta bloccato un account?
Conviene disattivare del tutto il blocco account?
Come scopro quali indirizzi IP bloccano il mio account?
Lo script non sblocca il mio account, da cosa dipende?
2026 KernelHost GmbH. Tutti i diritti riservati. Questa guida è protetta dal diritto d'autore. La ripubblicazione su altri siti web, anche parziale o in forma modificata, non è consentita senza il nostro consenso scritto. Le citazioni con indicazione della fonte e un link sono le benvenute.

