RDP-fout: vergrendeld Windows-account ontgrendelen (PowerShell)
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
- Het toont via
net accountshet huidige accountvergrendelingsbeleid, dus de drempelwaarde, de vergrendelingsduur en het observatievenster. - Het ontgrendelt het account dat onder
$Usernameis ingevuld, via de WinNT-directoryprovider. Dat is de tegenhanger vanUnlock-ADAccountvoor lokale accounts. - Het past het beleid aan, mits
$ApplyPolicyop$truestaat. Met de standaardwaarden wordt de vergrendeling minder agressief, met$LockoutThreshold = 0schakelt u haar volledig uit. - 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?
Hoe lang blijft een vergrendeld account vergrendeld?
Moet ik de accountvergrendeling helemaal uitschakelen?
Hoe kom ik erachter welke IP-adressen mijn account vergrendelen?
Het script ontgrendelt mijn account niet, waar ligt dat aan?
2026 KernelHost GmbH. Alle rechten voorbehouden. Deze handleiding is auteursrechtelijk beschermd. Publicatie op andere websites, geheel, gedeeltelijk of in bewerkte vorm, is zonder onze schriftelijke toestemming niet toegestaan. Citeren met bronvermelding en link is uitdrukkelijk welkom.

