Errore RDP: sbloccare un account Windows bloccato (PowerShell)

Pubblicato il Aggiornato il 6 min di lettura

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

  1. Con net accounts mostra il criterio di blocco account attuale, quindi soglia, durata del blocco e finestra di osservazione.
  2. Sblocca l'account indicato in $Username tramite il provider di directory WinNT. È l'equivalente di Unlock-ADAccount per gli account locali.
  3. Adatta il criterio, a patto che $ApplyPolicy sia impostato su $true. Con i valori predefiniti il blocco diventa meno aggressivo, mentre con $LockoutThreshold = 0 lo disattivi del tutto.
  4. 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?
Windows blocca un account non appena viene raggiunto il numero di tentativi di accesso falliti stabilito nel criterio di blocco. Su un server con la porta RDP aperta su Internet a far scattare questo blocco sono quasi sempre attacchi automatici.
Quanto resta bloccato un account?
Per tutto il tempo previsto dalla durata di blocco impostata, spesso 15 o 30 minuti. Dopo di che l'accesso torna possibile. Con lo script di questa guida rimuovi il blocco anche subito.
Conviene disattivare del tutto il blocco account?
Su un server raggiungibile pubblicamente meglio di no. Senza blocco chi attacca può provare quante password vuole. Ha più senso una soglia moderata, intorno ai 10 tentativi, insieme a una regola firewall che limita RDP al tuo indirizzo IP.
Come scopro quali indirizzi IP bloccano il mio account?
L'ID evento 4740 nel registro di sicurezza documenta i blocchi veri e propri, l'ID evento 4625 gli accessi falliti con il relativo IP di origine. Lo script di questa guida analizza automaticamente entrambi.
Lo script non sblocca il mio account, da cosa dipende?
Lo script si rivolge a un account locale. Con un account di dominio o su un controller di dominio devi usare invece Unlock-ADAccount. Verifica inoltre che PowerShell sia davvero in esecuzione come amministratore.

Windows Server Windows RDP Desktop remoto PowerShell Blocco account Brute-Force Sicurezza server