RDP-Fehler: gesperrtes Windows-Konto entsperren (PowerShell)

Veröffentlicht am Aktualisiert am 6 Min. Lesezeit

Ein gesperrtes Windows-Konto beim RDP-Login ist meist die Folge automatisierter Angriffe. Dieses PowerShell-Skript entsperrt das Konto, zeigt die Quell-IPs und passt die Sperrrichtlinie an.

Ihre Remote-Desktop-Anmeldung schlägt plötzlich fehl, und Windows meldet sinngemäß: "Aus Sicherheitsgründen wurde das Benutzerkonto gesperrt, da zu viele Anmeldeversuche oder Kennwortänderungsversuche unternommen wurden." Dann hat das Konto die Kontosperrungsrichtlinie von Windows ausgelöst. Die Ursache ist fast immer dieselbe: jemand oder etwas hat Ihren RDP-Zugang aus dem Internet mit Anmeldeversuchen bombardiert.

In dieser Anleitung zeigen wir Ihnen, wie Sie das Konto entsperren, herausfinden, welche IP-Adressen die Sperren auslösen, und die Sperrrichtlinie anpassen oder deaktivieren. Alles davon erledigt ein einziges PowerShell-Skript, ganz ohne Klickarbeit im Gruppenrichtlinien-Editor.

Warum wird ein Windows-Konto beim RDP-Login gesperrt?

Windows zählt fehlgeschlagene Anmeldeversuche und sperrt ein Konto, sobald die eingestellte Schwelle erreicht ist. Diese Schutzfunktion ist sinnvoll, wird aber zum Problem, sobald der RDP-Port offen im Internet steht: automatisierte Bots probieren dann rund um die Uhr Passwörter durch und sperren dabei genau das Konto aus, mit dem Sie selbst arbeiten möchten.

Drei Werte bestimmen das Verhalten:

  • Sperrschwelle: Anzahl der Fehlversuche bis zur Sperre
  • Sperrdauer: Minuten, die das Konto gesperrt bleibt
  • Zeitfenster: Minuten, über die Fehlversuche zusammengezählt werden

PowerShell als Administrator öffnen

Öffnen Sie die Windows PowerShell als Administrator. Klicken Sie dazu im Startmenü mit der rechten Maustaste auf "Windows PowerShell" und wählen Sie "Als Administrator ausführen". Ohne erhöhte Rechte kann das Skript weder das Konto entsperren noch die Richtlinie ändern.

Das Skript: Konto entsperren und Angreifer sichtbar machen

Passen Sie im Abschnitt "Einstellungen" den Kontonamen und die gewünschten Werte an und fügen Sie das Skript anschließend in die PowerShell ein:

#Requires -RunAsAdministrator

# KernelHost: gesperrtes Windows-RDP-Konto entsperren und Ursache finden
# In der Windows PowerShell als Administrator ausführen.

# ----------------------------------------------------------------------------
#  Einstellungen: bitte an Ihre Umgebung anpassen
# ----------------------------------------------------------------------------
$Username = 'Administrator'   # das lokale Konto, das entsperrt werden soll

$ApplyPolicy      = $true     # $false, wenn die Sperrrichtlinie unverändert bleiben soll
$LockoutThreshold = 10        # Fehlversuche bis zur Sperre (0 = Sperre DEAKTIVIEREN)
$LockoutDuration  = 15        # Minuten, die das Konto gesperrt bleibt
$LockoutWindow    = 15        # Minuten, über die Fehlversuche gezählt werden
# ----------------------------------------------------------------------------

# 1) Aktuelle Sperrrichtlinie anzeigen
Write-Host "`n=== 1) Aktuelle Sperrrichtlinie ===" -ForegroundColor Cyan
net accounts | Select-String 'Lockout|Sperr'

# 2) Konto entsperren
Write-Host "`n=== 2) Konto '$Username' entsperren ===" -ForegroundColor Cyan
try {
    $user = [ADSI]"WinNT://$env:COMPUTERNAME/$Username,user"
    if ($user.InvokeGet('IsAccountLocked')) {
        $user.InvokeSet('IsAccountLocked', $false)
        $user.SetInfo()
        Write-Host "  '$Username' war gesperrt und ist jetzt ENTSPERRT." -ForegroundColor Green
    } else {
        Write-Host "  '$Username' ist nicht gesperrt." -ForegroundColor Yellow
    }
} catch {
    Write-Warning "  '$Username' konnte nicht entsperrt werden: $($_.Exception.Message)"
}

# 3) Optional: Sperrrichtlinie anpassen oder deaktivieren
if ($ApplyPolicy) {
    Write-Host "`n=== 3) Sperrrichtlinie setzen ===" -ForegroundColor Cyan
    if ($LockoutThreshold -eq 0) {
        net accounts /lockoutthreshold:0 | Out-Null
        Write-Host "  Kontosperrung DEAKTIVIERT (Schwelle 0)." -ForegroundColor Yellow
        Write-Warning "  Auf einem öffentlich erreichbaren Server ist das NICHT empfohlen."
    } else {
        net accounts /lockoutthreshold:$LockoutThreshold /lockoutduration:$LockoutDuration /lockoutwindow:$LockoutWindow | Out-Null
        Write-Host "  Schwelle=$LockoutThreshold  Dauer=$LockoutDuration Min  Zeitfenster=$LockoutWindow Min" -ForegroundColor Green
    }
}

# 4) Wer löst die Sperren aus? (Quellen der RDP-Angriffe)
Write-Host "`n=== 4a) Letzte Sperr-Ereignisse (Security-ID 4740) ===" -ForegroundColor Cyan
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 10 -ErrorAction SilentlyContinue |
    ForEach-Object {
        $x = [xml]$_.ToXml()
        [pscustomobject]@{
            Zeit            = $_.TimeCreated
            GesperrtesKonto = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
            Quelle          = ($x.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetDomainName' }).'#text'
        }
    } | Format-Table -AutoSize

Write-Host "=== 4b) Häufigste Quell-IPs fehlgeschlagener Anmeldungen, letzte 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='QuellIP'; E={$_.Name}} -AutoSize

Was das Skript im Einzelnen macht

  1. Es zeigt über net accounts die aktuelle Kontosperrungsrichtlinie an, also Schwelle, Sperrdauer und Zeitfenster.
  2. Es entsperrt das unter $Username eingetragene Konto über den WinNT-Verzeichnisanbieter. Das ist die Entsprechung von Unlock-ADAccount für lokale Konten.
  3. Es passt die Richtlinie an, sofern $ApplyPolicy auf $true steht. Mit den Vorgabewerten wird die Sperre weniger aggressiv, mit $LockoutThreshold = 0 schalten Sie sie vollständig ab.
  4. Es listet die letzten Sperr-Ereignisse (Ereignis-ID 4740) sowie die häufigsten Quell-IP-Adressen fehlgeschlagener Anmeldungen der letzten 24 Stunden (Ereignis-ID 4625) auf. Das sind die Adressen, von denen aus Ihr RDP-Zugang angegriffen wird.

Hinweis zur Sprache: Auf einem deutschsprachigen Windows gibt net accounts die Werte unter deutschen Bezeichnungen aus. Deshalb filtert das Skript oben sowohl nach "Lockout" als auch nach "Sperr".

Lokales Konto oder Domänenkonto?

Das Skript spricht ein lokales Konto an, also den typischen Fall auf einem einzeln stehenden vServer oder Rootserver. Handelt es sich um ein Domänenkonto oder arbeiten Sie auf einem Domänencontroller, entsperren Sie das Konto stattdessen mit:

Unlock-ADAccount -Identity <Benutzername>

Sperrschwelle anpassen oder deaktivieren

Mit $LockoutThreshold = 0 schalten Sie den Sperrschutz komplett aus. Auf einem Server, der aus dem Internet erreichbar ist, raten wir davon ab: ohne Sperre kann ein Angreifer beliebig viele Passwörter durchprobieren. Sinnvoller ist eine moderate Schwelle, etwa 10 Fehlversuche, kombiniert mit den Maßnahmen aus dem nächsten Abschnitt.

Ursache beseitigen: RDP dauerhaft absichern

Ein gesperrtes Konto ist nur das Symptom. Die eigentliche Ursache ist ein RDP-Zugang, der für das gesamte Internet offen steht. Diese vier Maßnahmen beseitigen das Problem an der Wurzel.

RDP auf die eigene IP-Adresse begrenzen

Das ist die mit Abstand wirksamste Maßnahme. Ist RDP nur noch von Ihrer eigenen Adresse aus erreichbar, laufen sämtliche automatisierten Angriffe ins Leere:

# Eingehendes RDP nur noch von der eigenen IP-Adresse erlauben
Set-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (TCP-In)' -RemoteAddress '203.0.113.5'

Der angegebene Anzeigename gilt für ein englischsprachiges Windows. Auf einem deutschsprachigen System lautet er anders. Die vorhandenen Regeln und ihre genauen Bezeichnungen listen Sie mit Get-NetFirewallRule -DisplayGroup 'Remotedesktop' auf.

Einzelne Angreifer-IP blockieren

Für die Adressen, die Ihnen Schritt 4b des Skripts ausgibt, legen Sie gezielt eine Sperrregel an:

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

Das hilft gegen einzelne hartnäckige Quellen, ersetzt aber keine Beschränkung auf die eigene IP-Adresse, weil Angreifer laufend neue Adressen verwenden.

RDP-Port ändern

Wenn RDP nicht mehr auf dem Standardport 3389 lauscht, finden die üblichen Massenscans Ihren Dienst gar nicht erst. Wie Sie den Port ohne Server-Neustart umstellen, zeigt unsere Anleitung RDP-Port unter Windows ohne Neustart ändern.

Starkes Passwort und Network Level Authentication

Verwenden Sie ein langes, zufälliges Passwort und lassen Sie Network Level Authentication (NLA) aktiviert. NLA verlangt die Authentifizierung, bevor überhaupt eine Sitzung aufgebaut wird, und wehrt damit einen großen Teil der automatisierten Versuche bereits im Vorfeld ab.

Häufige Fragen

Warum wird mein Windows-Konto beim RDP-Login gesperrt?
Windows sperrt ein Konto, sobald die in der Sperrrichtlinie festgelegte Zahl fehlgeschlagener Anmeldeversuche erreicht ist. Auf einem Server mit offenem RDP-Port im Internet lösen fast immer automatisierte Angriffe diese Sperre aus.
Wie lange bleibt ein gesperrtes Konto gesperrt?
So lange, wie es die eingestellte Sperrdauer vorgibt, häufig 15 oder 30 Minuten. Danach ist eine Anmeldung wieder möglich. Mit dem Skript aus dieser Anleitung heben Sie die Sperre auch sofort auf.
Sollte ich die Kontosperrung ganz deaktivieren?
Auf einem öffentlich erreichbaren Server besser nicht. Ohne Sperre kann ein Angreifer beliebig viele Passwörter durchprobieren. Sinnvoller ist eine moderate Schwelle von etwa 10 Versuchen zusammen mit einer Firewall-Regel, die RDP auf Ihre eigene IP-Adresse begrenzt.
Wie finde ich heraus, welche IP-Adressen mein Konto sperren?
Die Ereignis-ID 4740 im Sicherheitsprotokoll dokumentiert die Sperrungen selbst, die Ereignis-ID 4625 die fehlgeschlagenen Anmeldungen samt Quell-IP. Das Skript in dieser Anleitung wertet beide automatisch aus.
Das Skript entsperrt mein Konto nicht, woran liegt das?
Das Skript spricht ein lokales Konto an. Bei einem Domänenkonto oder auf einem Domänencontroller entsperren Sie stattdessen mit Unlock-ADAccount. Prüfen Sie außerdem, ob die PowerShell wirklich als Administrator läuft.

Windows Server Windows RDP Remote Desktop PowerShell Kontosperrung Brute-Force Server-Sicherheit