Erreur RDP : déverrouiller un compte Windows verrouillé (PowerShell)
Un compte Windows verrouillé lors d'une connexion RDP est le plus souvent la conséquence d'attaques automatisées. Ce script PowerShell déverrouille le compte, affiche les adresses IP source et ajuste la stratégie de verrouillage.
Votre connexion Bureau à distance échoue soudainement et Windows affiche un message de ce type : « Pour des raisons de sécurité, le compte d'utilisateur a été verrouillé, car un trop grand nombre de tentatives de connexion ou de modification de mot de passe ont été effectuées. » Le compte a donc déclenché la stratégie de verrouillage de compte de Windows. La cause est presque toujours la même : quelqu'un ou quelque chose bombarde votre accès RDP de tentatives de connexion depuis Internet.
Dans ce guide, nous vous montrons comment déverrouiller le compte, identifier les adresses IP qui déclenchent les verrouillages et ajuster ou désactiver la stratégie de verrouillage. Un seul script PowerShell se charge de tout, sans le moindre clic dans l'éditeur de stratégie de groupe.
Pourquoi un compte Windows est-il verrouillé lors d'une connexion RDP ?
Windows compte les tentatives de connexion échouées et verrouille un compte dès que le seuil configuré est atteint. Cette protection est utile, mais elle devient un problème dès que le port RDP est ouvert sur Internet : des bots automatisés essaient alors des mots de passe 24h/24 et verrouillent précisément le compte avec lequel vous voulez travailler.
Trois valeurs déterminent ce comportement :
- Seuil de verrouillage : nombre de tentatives échouées avant le verrouillage
- Durée de verrouillage : minutes pendant lesquelles le compte reste verrouillé
- Fenêtre d'observation : minutes sur lesquelles les tentatives échouées sont additionnées
Ouvrir PowerShell en tant qu'administrateur
Ouvrez Windows PowerShell en tant qu'administrateur. Pour cela, faites un clic droit sur « Windows PowerShell » dans le menu Démarrer, puis choisissez « Exécuter en tant qu'administrateur ». Sans droits élevés, le script ne peut ni déverrouiller le compte ni modifier la stratégie.
Le script : déverrouiller le compte et démasquer les attaquants
Adaptez le nom du compte et les valeurs souhaitées dans la section « Paramètres », puis collez le script dans PowerShell :
#Requires -RunAsAdministrator
# KernelHost : déverrouiller un compte Windows RDP verrouillé et trouver la cause
# À exécuter dans Windows PowerShell en tant qu'administrateur.
# ----------------------------------------------------------------------------
# Paramètres : à adapter à votre environnement
# ----------------------------------------------------------------------------
$Username = 'Administrator' # le compte local à déverrouiller
$ApplyPolicy = $true # $false pour laisser la stratégie de verrouillage inchangée
$LockoutThreshold = 10 # tentatives échouées avant verrouillage (0 = DÉSACTIVER le verrouillage)
$LockoutDuration = 15 # minutes pendant lesquelles le compte reste verrouillé
$LockoutWindow = 15 # minutes sur lesquelles les tentatives échouées sont comptées
# ----------------------------------------------------------------------------
# 1) Afficher la stratégie de verrouillage actuelle
Write-Host "`n=== 1) Stratégie de verrouillage actuelle ===" -ForegroundColor Cyan
net accounts | Select-String 'Lockout|Sperr'
# 2) Déverrouiller le compte
Write-Host "`n=== 2) Déverrouillage du compte '$Username' ===" -ForegroundColor Cyan
try {
$user = [ADSI]"WinNT://$env:COMPUTERNAME/$Username,user"
if ($user.InvokeGet('IsAccountLocked')) {
$user.InvokeSet('IsAccountLocked', $false)
$user.SetInfo()
Write-Host " '$Username' était verrouillé et est maintenant DÉVERROUILLÉ." -ForegroundColor Green
} else {
Write-Host " '$Username' n'est pas verrouillé." -ForegroundColor Yellow
}
} catch {
Write-Warning " '$Username' n'a pas pu être déverrouillé : $($_.Exception.Message)"
}
# 3) Optionnel : ajuster ou désactiver la stratégie de verrouillage
if ($ApplyPolicy) {
Write-Host "`n=== 3) Application de la stratégie de verrouillage ===" -ForegroundColor Cyan
if ($LockoutThreshold -eq 0) {
net accounts /lockoutthreshold:0 | Out-Null
Write-Host " Verrouillage de compte DÉSACTIVÉ (seuil 0)." -ForegroundColor Yellow
Write-Warning " Sur un serveur accessible publiquement, ce n'est PAS recommandé."
} else {
net accounts /lockoutthreshold:$LockoutThreshold /lockoutduration:$LockoutDuration /lockoutwindow:$LockoutWindow | Out-Null
Write-Host " Seuil=$LockoutThreshold Durée=$LockoutDuration min Fenêtre=$LockoutWindow min" -ForegroundColor Green
}
}
# 4) Qui déclenche les verrouillages ? (sources des attaques RDP)
Write-Host "`n=== 4a) Derniers événements de verrouillage (Security-ID 4740) ===" -ForegroundColor Cyan
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 10 -ErrorAction SilentlyContinue |
ForEach-Object {
$x = [xml]$_.ToXml()
[pscustomobject]@{
Heure = $_.TimeCreated
CompteVerrouille = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
Source = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetDomainName' }).'#text'
}
} | Format-Table -AutoSize
Write-Host "=== 4b) IP sources les plus fréquentes des connexions échouées, dernières 24 h (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='IPSource'; E={$_.Name}} -AutoSize
Ce que fait le script en détail
- Il utilise
net accountspour afficher la stratégie de verrouillage de compte actuelle, c'est-à-dire le seuil, la durée de verrouillage et la fenêtre d'observation. - Il déverrouille le compte indiqué sous
$Usernamevia le fournisseur d'annuaire WinNT. C'est l'équivalent deUnlock-ADAccountpour les comptes locaux. - Il ajuste la stratégie, à condition que
$ApplyPolicysoit sur$true. Avec les valeurs par défaut, le verrouillage devient moins agressif ; avec$LockoutThreshold = 0, vous le désactivez complètement. - Il liste les derniers événements de verrouillage (ID d'événement 4740) ainsi que les adresses IP source les plus fréquentes des connexions échouées des dernières 24 heures (ID d'événement 4625). Ce sont les adresses depuis lesquelles votre accès RDP est attaqué.
Remarque sur la langue : sur un Windows localisé, net accounts affiche ces valeurs sous des libellés traduits. C'est pourquoi le script ci-dessus filtre à la fois sur « Lockout » et sur « Sperr ». Sur un système en français, ajoutez « verrouillage » au motif de recherche.
Compte local ou compte de domaine ?
Le script s'adresse à un compte local, soit le cas classique sur un vServer ou un serveur root isolé. S'il s'agit d'un compte de domaine, ou si vous travaillez sur un contrôleur de domaine, déverrouillez plutôt le compte ainsi :
Unlock-ADAccount -Identity <nom_utilisateur>
Ajuster ou désactiver le seuil de verrouillage
Avec $LockoutThreshold = 0, vous coupez complètement la protection par verrouillage. Sur un serveur accessible depuis Internet, nous le déconseillons : sans verrouillage, un attaquant peut essayer autant de mots de passe qu'il le souhaite. Un seuil modéré, environ 10 tentatives échouées, combiné aux mesures de la section suivante, est bien plus judicieux.
Traiter la cause : sécuriser durablement l'accès RDP
Un compte verrouillé n'est que le symptôme. La véritable cause est un accès RDP ouvert à Internet tout entier. Ces quatre mesures s'attaquent au problème à la racine.
Limiter le RDP à votre propre adresse IP
C'est de loin la mesure la plus efficace. Si le RDP n'est plus joignable que depuis votre propre adresse, toutes les attaques automatisées tombent dans le vide :
# Autoriser le RDP entrant uniquement depuis votre propre adresse IP
Set-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (TCP-In)' -RemoteAddress '203.0.113.5'
Le nom d'affichage indiqué ici vaut pour un Windows en anglais. Sur un système localisé, en français comme en allemand, il est différent. Vous listez les règles existantes et leurs noms exacts avec Get-NetFirewallRule -DisplayGroup 'Remotedesktop'.
Bloquer une adresse IP d'attaquant précise
Pour les adresses que l'étape 4b du script vous affiche, créez une règle de blocage ciblée :
New-NetFirewallRule -DisplayName 'Block RDP attacker 203.0.113.9' -Direction Inbound -Action Block -RemoteAddress '203.0.113.9'
Cela aide contre quelques sources tenaces, mais ne remplace pas la restriction à votre propre adresse IP, car les attaquants changent sans cesse d'adresse.
Changer le port RDP
Si le RDP n'écoute plus sur le port 3389 par défaut, les scans de masse habituels ne trouveront même pas votre service. Notre guide Changer le port RDP sous Windows sans redémarrage explique comment modifier le port sans redémarrer le serveur.
Mot de passe fort et Network Level Authentication
Utilisez un mot de passe long et aléatoire, et laissez Network Level Authentication (NLA) activé. NLA exige une authentification avant même qu'une session ne soit établie, ce qui écarte en amont une grande partie des tentatives automatisées.
Questions fréquentes
Pourquoi mon compte Windows est-il verrouillé lors d'une connexion RDP ?
Combien de temps un compte verrouillé reste-t-il bloqué ?
Faut-il désactiver complètement le verrouillage de compte ?
Comment savoir quelles adresses IP verrouillent mon compte ?
Le script ne déverrouille pas mon compte, d'où cela vient-il ?
2026 KernelHost GmbH. Tous droits réservés. Ce guide est protégé par le droit d'auteur. Sa republication sur d'autres sites web, même partielle ou sous une forme modifiée, n'est pas autorisée sans notre accord écrit. Les citations accompagnées de la source et d'un lien sont expressément les bienvenues.

