Erreur RDP : déverrouiller un compte Windows verrouillé (PowerShell)

Publié le Mis à jour le 7 min de lecture

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

  1. Il utilise net accounts pour 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.
  2. Il déverrouille le compte indiqué sous $Username via le fournisseur d'annuaire WinNT. C'est l'équivalent de Unlock-ADAccount pour les comptes locaux.
  3. Il ajuste la stratégie, à condition que $ApplyPolicy soit sur $true. Avec les valeurs par défaut, le verrouillage devient moins agressif ; avec $LockoutThreshold = 0, vous le désactivez complètement.
  4. 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 ?
Windows verrouille un compte dès que le nombre de tentatives de connexion échouées défini dans la stratégie de verrouillage est atteint. Sur un serveur dont le port RDP est ouvert sur Internet, ce sont presque toujours des attaques automatisées qui déclenchent ce verrouillage.
Combien de temps un compte verrouillé reste-t-il bloqué ?
Aussi longtemps que la durée de verrouillage configurée l'impose, souvent 15 ou 30 minutes. Ensuite, la connexion redevient possible. Le script de ce guide lève aussi le verrouillage immédiatement.
Faut-il désactiver complètement le verrouillage de compte ?
Sur un serveur accessible publiquement, mieux vaut éviter. Sans verrouillage, un attaquant peut essayer autant de mots de passe qu'il le souhaite. Un seuil modéré d'environ 10 tentatives est plus judicieux, associé à une règle de pare-feu qui limite le RDP à votre propre adresse IP.
Comment savoir quelles adresses IP verrouillent mon compte ?
L'ID d'événement 4740 du journal de sécurité documente les verrouillages eux-mêmes, l'ID d'événement 4625 les connexions échouées avec leur IP source. Le script de ce guide analyse les deux automatiquement.
Le script ne déverrouille pas mon compte, d'où cela vient-il ?
Le script s'adresse à un compte local. Pour un compte de domaine ou sur un contrôleur de domaine, utilisez plutôt Unlock-ADAccount. Vérifiez également que PowerShell s'exécute bien en tant qu'administrateur.

Windows Server Windows RDP Remote Desktop PowerShell Verrouillage de compte Force brute Sécurité serveur