RDP-fout: vergrendeld Windows-account ontgrendelen (PowerShell)

Gepubliceerd op Bijgewerkt op 7 min leestijd

Een vergrendeld Windows-account bij het inloggen via RDP is meestal het gevolg van geautomatiseerde aanvallen. Dit PowerShell-script ontgrendelt het account, toont de bron-IP-adressen en past het vergrendelingsbeleid aan.

Uw Remote Desktop-aanmelding mislukt opeens en Windows meldt zoiets als: "Om veiligheidsredenen is het gebruikersaccount vergrendeld, omdat er te veel aanmeldpogingen of pogingen tot wachtwoordwijziging zijn ondernomen." Dan heeft het account het accountvergrendelingsbeleid van Windows in werking gezet. De oorzaak is bijna altijd dezelfde: iemand of iets bestookt uw RDP-toegang vanaf het internet met inlogpogingen.

In deze handleiding laten wij zien hoe u het account ontgrendelt, achterhaalt welke IP-adressen de vergrendelingen veroorzaken en het vergrendelingsbeleid aanpast of uitschakelt. Eén enkel PowerShell-script regelt dat allemaal, zonder klikwerk in de editor voor groepsbeleid.

Waarom wordt een Windows-account bij het inloggen via RDP vergrendeld?

Windows telt mislukte aanmeldpogingen en vergrendelt een account zodra de ingestelde drempelwaarde is bereikt. Die beveiliging is zinvol, maar wordt een probleem zodra de RDP-poort open op het internet staat: geautomatiseerde bots proberen dan de klok rond wachtwoorden uit en vergrendelen juist het account waarmee u zelf wilt werken.

Drie waarden bepalen dat gedrag:

  • Vergrendelingsdrempel: aantal mislukte pogingen tot de vergrendeling
  • Vergrendelingsduur: minuten dat het account vergrendeld blijft
  • Observatievenster: minuten waarover mislukte pogingen bij elkaar worden opgeteld

PowerShell als administrator openen

Open Windows PowerShell als administrator. Klik daarvoor in het startmenu met de rechtermuisknop op "Windows PowerShell" en kies "Als administrator uitvoeren". Zonder verhoogde rechten kan het script het account niet ontgrendelen en het beleid niet wijzigen.

Het script: account ontgrendelen en aanvallers zichtbaar maken

Pas in het gedeelte "Instellingen" de accountnaam en de gewenste waarden aan en plak het script daarna in PowerShell:

#Requires -RunAsAdministrator

# KernelHost: een vergrendeld Windows-RDP-account ontgrendelen en de oorzaak vinden
# Uit te voeren in Windows PowerShell als administrator.

# ----------------------------------------------------------------------------
#  Instellingen: pas deze aan uw omgeving aan
# ----------------------------------------------------------------------------
$Username = 'Administrator'   # het lokale account dat ontgrendeld moet worden

$ApplyPolicy      = $true     # $false als het vergrendelingsbeleid ongewijzigd moet blijven
$LockoutThreshold = 0         # mislukte pogingen tot de vergrendeling (0 = vergrendeling UIT, zie tekst)
$LockoutDuration  = 15        # minuten dat het account vergrendeld blijft
$LockoutWindow    = 15        # minuten waarover mislukte pogingen worden geteld
# ----------------------------------------------------------------------------

# 1) Huidig vergrendelingsbeleid tonen
Write-Host "`n=== 1) Huidig vergrendelingsbeleid ===" -ForegroundColor Cyan
net accounts | Select-String 'Lockout|Sperr'

# 2) Account ontgrendelen
Write-Host "`n=== 2) Account '$Username' ontgrendelen ===" -ForegroundColor Cyan
try {
    $user = [ADSI]"WinNT://$env:COMPUTERNAME/$Username,user"
    if ($user.InvokeGet('IsAccountLocked')) {
        $user.InvokeSet('IsAccountLocked', $false)
        $user.SetInfo()
        Write-Host "  '$Username' was vergrendeld en is nu ONTGRENDELD." -ForegroundColor Green
    } else {
        Write-Host "  '$Username' is niet vergrendeld." -ForegroundColor Yellow
    }
} catch {
    Write-Warning "  '$Username' kon niet worden ontgrendeld: $($_.Exception.Message)"
}

# 3) Optioneel: vergrendelingsbeleid aanpassen of uitschakelen
if ($ApplyPolicy) {
    Write-Host "`n=== 3) Vergrendelingsbeleid instellen ===" -ForegroundColor Cyan
    if ($LockoutThreshold -eq 0) {
        net accounts /lockoutthreshold:0 | Out-Null
        Write-Host "  Accountvergrendeling UITGESCHAKELD (drempel 0)." -ForegroundColor Yellow
        Write-Host "  Beperk RDP nu via de firewall tot uw eigen IP-adres." -ForegroundColor Yellow
    } else {
        net accounts /lockoutthreshold:$LockoutThreshold /lockoutduration:$LockoutDuration /lockoutwindow:$LockoutWindow | Out-Null
        Write-Host "  Drempel=$LockoutThreshold  Duur=$LockoutDuration min  Venster=$LockoutWindow min" -ForegroundColor Green
    }
}

# 4) Wie veroorzaakt de vergrendelingen? (bronnen van de RDP-aanvallen)
Write-Host "`n=== 4a) Laatste vergrendelingsgebeurtenissen (Security-ID 4740) ===" -ForegroundColor Cyan
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 10 -ErrorAction SilentlyContinue |
    ForEach-Object {
        $x = [xml]$_.ToXml()
        [pscustomobject]@{
            Tijd               = $_.TimeCreated
            VergrendeldAccount = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
            Bron               = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetDomainName' }).'#text'
        }
    } | Format-Table -AutoSize

Write-Host "=== 4b) Meest voorkomende bron-IP-adressen van mislukte aanmeldingen, laatste 24 uur (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='BronIP'; E={$_.Name}} -AutoSize

Wat het script precies doet

  1. Het toont via net accounts het huidige accountvergrendelingsbeleid, dus de drempelwaarde, de vergrendelingsduur en het observatievenster.
  2. Het ontgrendelt het account dat onder $Username is ingevuld, via de WinNT-directoryprovider. Dat is de tegenhanger van Unlock-ADAccount voor lokale accounts.
  3. Het past het beleid aan, mits $ApplyPolicy op $true staat. Met de standaardwaarden wordt de vergrendeling minder agressief, met $LockoutThreshold = 0 schakelt u haar volledig uit.
  4. Het somt de laatste vergrendelingsgebeurtenissen (gebeurtenis-ID 4740) op, plus de meest voorkomende bron-IP-adressen van mislukte aanmeldingen in de afgelopen 24 uur (gebeurtenis-ID 4625). Dat zijn de adressen van waaruit uw RDP-toegang wordt aangevallen.

Opmerking over de taal: op een Duitstalig Windows toont net accounts de waarden onder vertaalde labels. Daarom filtert het script hierboven zowel op "Lockout" als op "Sperr". Voeg op een Nederlandstalig systeem "Vergrendel" aan het zoekpatroon toe.

Lokaal account of domeinaccount?

Het script richt zich op een lokaal account, het gebruikelijke geval op een losstaande VPS of rootserver. Gaat het om een domeinaccount, of werkt u op een domeincontroller, ontgrendel het account dan zo:

Unlock-ADAccount -Identity <gebruikersnaam>

Vergrendelingsdrempel aanpassen of uitschakelen

Het script zet de drempelwaarde standaard op 0 en schakelt de accountvergrendeling daarmee uit. Dat klinkt in eerste instantie verkeerd, maar bij een RDP-toegang die open op het internet staat is het de betere keuze. De reden: een aanvaller hoeft uw wachtwoord helemaal niet te raden. Het volstaat dat hij om de paar minuten een handvol foute pogingen stuurt, zodat het account permanent vergrendeld blijft. De vergrendeling treft dan niet hem, maar uitsluitend u. Een beveiligingsfunctie wordt zo een handig middel om u bij uw eigen server vandaan te houden.

Belangrijk: de vergrendeling uitschakelen vervangt geen beveiliging, het ruimt alleen de verkeerde op. De bescherming tegen het systematisch uitproberen van wachtwoorden hoort een laag lager thuis, namelijk bij de firewall: is RDP alleen nog vanaf uw eigen IP-adres bereikbaar, dan komt geen enkele aanvaller nog tot het aanmeldscherm en valt er niets meer te tellen. Werk de volgende paragraaf daarom af voordat u de vergrendeling uitschakelt, niet erna.

Moet u RDP om bedrijfsmatige redenen voor wisselende adressen open laten, stel dan een hoge drempelwaarde in met een korte vergrendelingsduur, bijvoorbeeld $LockoutThreshold = 50 en $LockoutDuration = 5. Zo blijft er een remmende werking over, zonder dat u zichzelf bij elke scan buitensluit. In een domein met intern RDP geldt nog steeds de klassieke aanbeveling van een lage drempelwaarde, want daar is de toegang sowieso niet vanaf het internet bereikbaar.

Oorzaak wegnemen: RDP blijvend beveiligen

Een vergrendeld account is slechts het symptoom. De werkelijke oorzaak is een RDP-toegang die voor het hele internet openstaat. Deze vier maatregelen pakken het probleem bij de wortel aan.

RDP tot het eigen IP-adres beperken

Dat is verreweg de meest doeltreffende maatregel. Is RDP alleen nog vanaf uw eigen adres bereikbaar, dan lopen alle geautomatiseerde aanvallen dood:

# Inkomend RDP alleen nog vanaf het eigen IP-adres toestaan
Set-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (TCP-In)' -RemoteAddress '203.0.113.5'

De hier genoemde weergavenaam geldt voor een Engelstalig Windows. Op een gelokaliseerd systeem, in het Nederlands net zo goed als in het Duits, luidt hij anders. De bestaande regels en hun exacte namen somt u op met Get-NetFirewallRule -DisplayGroup 'Remotedesktop'.

Het IP-adres van een aanvaller blokkeren

Voor de adressen die stap 4b van het script u toont, maakt u gericht een blokkeerregel aan:

New-NetFirewallRule -DisplayName 'Block RDP attacker 203.0.113.9' -Direction Inbound -Action Block -RemoteAddress '203.0.113.9'

Dat helpt tegen een paar hardnekkige bronnen, maar het vervangt de beperking tot uw eigen IP-adres niet, omdat aanvallers voortdurend nieuwe adressen gebruiken.

RDP-poort wijzigen

Luistert RDP niet meer op de standaardpoort 3389, dan vinden de gebruikelijke massascans uw dienst al helemaal niet. Hoe u de poort omzet zonder de server te herstarten, leest u in onze handleiding RDP-poort onder Windows wijzigen zonder herstart.

Sterk wachtwoord en Network Level Authentication

Gebruik een lang, willekeurig wachtwoord en laat Network Level Authentication (NLA) ingeschakeld. NLA vereist authenticatie voordat er ook maar een sessie tot stand komt en weert daarmee een groot deel van de geautomatiseerde pogingen al op voorhand af.

Veelgestelde vragen

Waarom wordt mijn Windows-account bij het inloggen via RDP vergrendeld?
Windows vergrendelt een account zodra het in het vergrendelingsbeleid vastgelegde aantal mislukte aanmeldpogingen is bereikt. Op een server met een open RDP-poort op het internet zijn het bijna altijd geautomatiseerde aanvallen die deze vergrendeling veroorzaken.
Hoe lang blijft een vergrendeld account vergrendeld?
Zo lang als de ingestelde vergrendelingsduur voorschrijft, vaak 15 of 30 minuten. Daarna is inloggen weer mogelijk. Met het script uit deze handleiding heft u de vergrendeling ook onmiddellijk op.
Moet ik de accountvergrendeling helemaal uitschakelen?
Bij een RDP-toegang die open op het internet staat wel. Een aanvaller hoeft uw wachtwoord niet te raden: het volstaat dat hij regelmatig foute pogingen stuurt en het account daarmee permanent vergrendeld houdt. De vergrendeling treft dan alleen u. Schakel haar uit, maar beperk RDP in dezelfde beweging via de firewall tot uw eigen IP-adres, anders ruilt u het ene probleem in voor het andere. Moet u RDP voor wisselende adressen open laten, kies dan in plaats van 0 een hoge drempelwaarde met een korte vergrendelingsduur.
Hoe kom ik erachter welke IP-adressen mijn account vergrendelen?
Gebeurtenis-ID 4740 in het beveiligingslogboek documenteert de vergrendelingen zelf, gebeurtenis-ID 4625 de mislukte aanmeldingen inclusief het bron-IP-adres. Het script in deze handleiding leest beide automatisch uit.
Het script ontgrendelt mijn account niet, waar ligt dat aan?
Het script richt zich op een lokaal account. Bij een domeinaccount of op een domeincontroller ontgrendelt u in plaats daarvan met Unlock-ADAccount. Controleer daarnaast of PowerShell werkelijk als administrator draait.

Windows Server Windows RDP Remote Desktop PowerShell Accountvergrendeling Brute force Serverbeveiliging