Als Systemadministrator kennst du das Problem sicherlich: Ein Benutzer ruft an, weil sein Passwort abgelaufen ist und er sich nicht mehr anmelden kann. Besonders ärgerlich wird es, wenn das am Wochenende passiert oder wenn mehrere Benutzer gleichzeitig betroffen sind. Mit dem richtigen PowerShell-Skript lässt sich dieses Problem elegant lösen – und genau darum geht es in diesem Artikel.

Warum Passwort-Monitoring im Active Directory so wichtig ist

In einer typischen Windows-Domäne laufen Passwörter regelmäßig ab – meist nach 90 Tagen. Das ist gut für die Sicherheit, aber schlecht für die Nerven, wenn Benutzer „überrascht“ werden. Ein proaktiver Ansatz spart nicht nur Zeit, sondern auch Stress. Statt reaktiv auf Anrufe zu reagieren, kannst du mit einem cleveren PowerShell-Skript im Voraus sehen, wessen Passwort demnächst abläuft.

Das hier vorgestellte Skript ist ein echter Game-Changer für jeden Admin-Alltag. Es zeigt dir nicht nur, welche Benutzer betroffen sind, sondern auch wann genau deren Passwörter ablaufen – sogar mit einer praktischen Wochenend-Markierung.

Powershellskript zum Auslesen der als nächstes ablaufenden Benutzerkennwörter.
Übersichtliche Darstellung der Benutzer, deren Kennwort in den kommenden Tagen abläuft.

Das Skript im Überblick: Was es kann und warum es so nützlich ist

Mein PowerShell-Skript für die Passwort-Ablauf-Überwachung ist darauf ausgelegt, Dir einen vollständigen Überblick über anstehende Passwortänderungen zu geben. Es durchsucht Dein Active Directory, filtert aktive Benutzer heraus und zeigt Dir übersichtlich an, wer in den nächsten Tagen sein Passwort ändern muss. Besonders praktisch: Das Skript hebt Benutzer farblich hervor, deren Passwort am Wochenende abläuft. So weißt Du sofort, bei wem Du vielleicht vorab aktiv werden solltest, damit am Montag (oder gar am Wochenende) nicht das Telefon heiß läuft.

Im folgenden beschreibe ich die einzelnen Schritte des Skriptes. Das fertige Skript findest Du am Ende des Artikels.

Die Konfiguration: Flexible Zeitspanne festlegen

Der erste Schritt des Skripts ist denkbar einfach, aber wichtig: Hier legst Du fest, wie weit in die Zukunft das Skript schauen soll. Der Standard von 10 Tagen hat sich in der Praxis bewährt – das gibt Dir genug Vorlaufzeit, um Benutzer zu informieren, ohne dass die Liste zu lang wird.

$tage = 10

Du kannst diesen Wert natürlich an Deine Bedürfnisse anpassen. In kleineren Umgebungen reichen vielleicht 7 Tage, in größeren Organisationen könnte ein Fenster von 14 Tagen eventuell sinnvoller sein.

Zugriff aufs Active Directory: Das Fundament des Skripts

Hier passiert die Vorbereitung für alle weiteren Aktionen. Das Active Directory-Modul wird geladen – ohne dieses läuft gar nichts. Gleichzeitig berechnet das Skript das Datum, bis zu dem es schauen soll. Diese Logik ist simpel, aber effektiv: Heute plus die gewünschte Anzahl Tage ergibt den Stichtag.

Import-Module ActiveDirectory
$heute = Get-Date
$inxTagen = $heute.AddDays($tage)

Domain-Password-Policy auslesen: Automatik statt Rätselraten

$domainPolicy = Get-ADDefaultDomainPasswordPolicy
$maxPasswordAge = $domainPolicy.MaxPasswordAge

Statt die Passwort-Gültigkeit manuell zu hinterlegen, liest das Skript die aktuell gültige Domain-Policy aus. Das bedeutet, wenn sich die Passwort-Richtlinien ändern, passt sich das Skript automatisch an. Keine manuellen Anpassungen nötig – das Skript bleibt immer aktuell.

Benutzer-Abfrage: Intelligente Filterung

Der Kern des Skripts ist eine durchdachte Active Directory-Abfrage:

$benutzerMitAblaufendemKennwort = Get-ADUser -Filter {
    Enabled -eq $true -and 
    PasswordNeverExpires -eq $false
} -Properties GivenName, Surname, SamAccountName, PasswordLastSet, PasswordNeverExpires, Enabled 

Diese Zeile macht mehrere wichtige Dinge gleichzeitig: Sie holt nur aktive Benutzerkonten und schließt solche aus, deren Passwort nie abläuft (wie oft bei Service-Accounts der Fall). Das spart Zeit und zeigt Dir nur die wirklich relevanten Benutzer. Die Properties-Parameter sorgen dafür, dass alle benötigten Informationen gleich mitgeladen werden.

Berechnung des Ablaufdatums: Mathematik im Dienst der Administration

$passwordExpiryDate = $_.PasswordLastSet.AddDays($maxPasswordAge.Days)

Die Logik dahinter ist simpel: Letztes Passwort-Datum plus maximale Gültigkeit ergibt das Ablaufdatum. Das Skript prüft dann, ob dieses Datum in den gewünschten Zeitraum fällt. Nur Benutzer, die diese Bedingung erfüllen, landen in der Ausgabe.

Ausgabe-Formatierung: Übersichtlichkeit ist alles

Das Skript erstellt eine saubere, tabellarische Ausgabe mit benutzerdefinierten Spalten:

  • Nachname/Vorname: Für die persönliche Identifikation
  • Benutzername: Für technische Referenz
  • Ablaufdatum: Präzise formatiert mit Datum und Uhrzeit
  • Wochentag-Info: Besondere Kennzeichnung für Wochenend-Abläufe

Die Sortierung erfolgt chronologisch, sodass die dringendsten Fälle oben stehen.

Wochenend-Erkennung: Der praktische Bonus

if ($ablaufDatum.DayOfWeek -eq 'Saturday' -or $ablaufDatum.DayOfWeek -eq 'Sunday') {
    # Wochentag anzeigen
}

Diese Funktion ist Gold wert im Admin-Alltag: Benutzer, deren Passwort am Wochenende abläuft, werden gelb markiert. So siehst Du auf einen Blick, wo du vielleicht proaktiv handeln solltest, bevor das Wochenende kommt.

Farbige Konsolen-Ausgabe: Information auf den ersten Blick

Das Skript nutzt PowerShells Farb-Features geschickt aus:

  • Normale Benutzer: Standard-Textfarbe
  • Wochenend-Abläufe: Gelb hervorgehoben
  • Überschriften und Trennlinien: Cyan für bessere Struktur
  • Zusammenfassung: Grün und Weiß für wichtige Informationen

Diese farbliche Kodierung macht die Ausgabe nicht nur schöner, sondern vor allem funktionaler.

Praktische Anwendung: So integrierst du das Skript in deinen Workflow

Das Skript eignet sich perfekt für verschiedene Einsatzszenarien:

  • Täglicher Check: Führe es jeden Morgen aus, um einen Überblick über anstehende Passwort-Abläufe zu bekommen.
  • Wöchentlicher Report: Nutze es montags, um die Woche zu planen und Benutzer über kommende Abläufe zu informieren.
  • Vor dem Wochenende: Ein Freitag-Check zeigt Dir, ob übers Wochenende Probleme drohen.

Erweiterungsmöglichkeiten: Das Skript als Basis

Das vorgestellte Skript ist bereits sehr funktional, aber es lässt sich leicht erweitern:

  • E-Mail-Benachrichtigungen: Automatischer Versand an betroffene Benutzer
  • CSV-Export: Für weitere Verarbeitung oder Reporting
  • Slack/Teams-Integration: Automatische Benachrichtigungen an Dein Admin-Team
  • Filterung nach OU: Fokus auf bestimmte Organisationseinheiten

Fazit: Proaktive Administration spart Zeit und Nerven

Mit diesem PowerShell-Skript verwandelst Du Dich von einem reaktiven zu einem proaktiven Administrator. Statt auf Anrufe zu warten, behältst Du die Kontrolle über Passwort-Abläufe in Deiner Domain. Die Kombination aus automatischer Policy-Erkennung, intelligenter Filterung und übersichtlicher Ausgabe macht das Skript zu einem wertvollen Werkzeug für jeden Windows-Administrator. Die Wochenend-Erkennung ist dabei das Sahnehäubchen, das den praktischen Nutzen noch einmal deutlich steigert.

Probiere das Skript aus und passe es gerne an Deine Bedürfnisse an. Dein Admin-Alltag kann so viel ruhiger werden kann, wenn Du immer einen Schritt voraus bist.

# Eingabe der Zeitspanne
$tage = 10

# Active Directory-Modul importieren
Import-Module ActiveDirectory

# Aktuelles Datum und Datum in x Tagen berechnen
$heute = Get-Date
$inxTagen = $heute.AddDays($tage)

# Domain-Password-Policy abrufen um MaxPasswordAge zu ermitteln
$domainPolicy = Get-ADDefaultDomainPasswordPolicy
$maxPasswordAge = $domainPolicy.MaxPasswordAge

# Benutzer abrufen, deren Kennwort in den nächsten x Tagen abläuft
$benutzerMitAblaufendemKennwort = Get-ADUser -Filter {
    Enabled -eq $true -and 
    PasswordNeverExpires -eq $false
} -Properties GivenName, Surname, SamAccountName, PasswordLastSet, PasswordNeverExpires, Enabled |
Where-Object { $_.PasswordLastSet -ne $null } |
Where-Object {
    # Kennwort-Ablaufdatum berechnen
    $passwordExpiryDate = $_.PasswordLastSet.AddDays($maxPasswordAge.Days)
    
    # Prüfen ob das Kennwort in den nächsten x Tagen abläuft
    $passwordExpiryDate -ge $heute -and $passwordExpiryDate -le $inxTagen
} |
Select-Object @{
    Name = "Nachname"
    Expression = { $_.Surname }
}, @{
    Name = "Vorname" 
    Expression = { $_.GivenName }
}, @{
    Name = "Benutzername"
    Expression = { $_.SamAccountName }
},  @{
    Name = "Kennwort_läuft_ab"
    Expression = { $_.PasswordLastSet.AddDays($maxPasswordAge.Days).ToString("dd.MM.yyyy HH:mm:ss") }
},	@{
    Name = "Wochentag"
    Expression = { 
        $ablaufDatum = $_.PasswordLastSet.AddDays($maxPasswordAge.Days)
        if ($ablaufDatum.DayOfWeek -eq 'Saturday' -or $ablaufDatum.DayOfWeek -eq 'Sunday') {
            switch ($ablaufDatum.DayOfWeek) {
                'Saturday' { 'Samstag' }
                'Sunday' { 'Sonntag' }
            }
        } else {
            ''
        }
    }
} |
Sort-Object { [DateTime]::ParseExact($_.Kennwort_läuft_ab, "dd.MM.yyyy HH:mm:ss", $null) }

# Ergebnisse anzeigen
if ($benutzerMitAblaufendemKennwort.Count -gt 0) {
    Write-Host "Bis zum " -ForegroundColor White -NoNewLine 
	Write-Host $inxTagen.ToString("dd.MM.yyyy") -ForegroundColor Green -NoNewLine
	Write-Host " laufen von folgenden " -ForegroundColor White -NoNewLine 
	Write-Host "$($benutzerMitAblaufendemKennwort.Count)" -ForegroundColor Green -NoNewLine 
	Write-Host " Benutzer(n) die Kennwörter ab:" -ForegroundColor White
    Write-Host ""
	
    # Überschriften anzeigen
    $header = "{0,-25} {1,-20} {2,-25} {3,-20} {4}" -f "Nachname", "Vorname", "Benutzername", "Kennwort läuft ab","Info"
    Write-Host $header -ForegroundColor Cyan
    Write-Host ("-" * 101) -ForegroundColor Cyan
    
    # Benutzer nach Wochentag trennen und unterschiedlich formatieren
    foreach ($benutzer in $benutzerMitAblaufendemKennwort) {
        $zeile = "{0,-25} {1,-20} {2,-25} {3,-20} {4}" -f $benutzer.Nachname, $benutzer.Vorname, $benutzer.Benutzername, $benutzer.Kennwort_läuft_ab, $benutzer.Wochentag
        
        if ($benutzer.Wochentag -eq 'Samstag' -or $benutzer.Wochentag -eq 'Sonntag') {
            Write-Host $zeile -ForegroundColor Yellow
        } else {
            Write-Host $zeile
        }
    }
	Write-Host ("-" * 101) -ForegroundColor Cyan
	Write-Host ""
	Write-Host "Benutzer, deren Kennwort am Wochenende abläuft, sind in gelber Schrift dargestellt." -ForegroundColor Cyan
    
} else {
    Write-Host "Keine Benutzer mit ablaufenden Kennwörtern in den nächsten $Tage Tagen gefunden." -ForegroundColor Green
}

Dieser Artikel ist wie alle anderen auf dieser Seite kostenlos für Dich und ich hoffe, ich konnte Dir weiterhelfen. Wer möchte, kann diesem Blog eine kleine Aufmerksamkeit in Form einer kleinen Spende (PayPal) oder über die Amazon Wunschliste zukommen lassen.