Ablaufdatum von AD-Passwörtern in PowerShell auslesen

    Kennwort ändern in RemotedesktopMit Hilfe des Modules ActiveDirectory ist PowerShell in der Lage, die meisten Informa­tionen von AD-Objekten auszulesen oder zu än­dern. Dazu gehören auch die verschie­denen Ein­stellungen für Passwörter von Benutzer­konten, etwa deren Ablauf­datum oder der Zeitpunkt ihrer letzten Änderung.

    Als besonders nützlich erweist sich PowerShell für das AD-Reporting, weil die grafischen Management-Tools dafür nur unzureichend geeignet sind. Nach der Installation des Moduls ActiveDirectory kann man viele kritische Konfigu­ra­tionen oft mit Hilfe einzelner Befehle entdecken.

    Informationen zu Kennwörtern

    Zu den wesentlichen Funktionen des AD gehört zweifellos das Management von Passwörtern. In diesem Zusammenhang kann PowerShell beispielsweise die herrschenden Regeln anzeigen und ändern oder herausfinden, welche Benutzer sich ohne Kennwort anmelden dürfen.

    Eine aufschlussreiche Information für die Verwaltung von Benutzerkonten ist auch das Ablaufdatum für Passwörter und wann User diese zuletzt geändert haben. Beide lassen sich relativ einfach über die entsprechenden Attribute ermitteln.

    User-Objekte einlesen

    Benötigt man die User-Liste für mehrere Operationen, dann sollte man sie zuerst in einer Variable speichern:

    $Users = Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword

    Dieser Aufruf ermittelt alle User-Objekte, deren Konto nicht deaktiviert ist und deren Passwörter ein Ablaufdatum haben. Über den Parameter Properties lädt er die nachher erforderlichen Attribute für Ablaufdatum, das Datum des letzten Kennwortwechsels und das Recht, das Passwort ändern zu dürfen.

    Möchte man die Abfrage in großen Verzeichnissen auf bestimmte Domänen oder OUs eingrenzen, dann kann man dies über den Parameter SearchBase tun (siehe dazu Get-ADUser, Set-ADUser: Benutzer anlegen, abfragen und ändern mit PowerShell).

    Ablaufdatum der Passwörter anzeigen

    Möchte man nur eine Übersicht über Ablaufdatum und Zeitpunkt des letzten Kennwortwechsels generieren, dann man dies folgendermaßen tun:

    $Users | select Name, @{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet

    Das Attribut msDS-UserPasswordExpiryTimeComputed enthält das Ablaufdatum nicht in einem lesbaren Format, so dass der obige Befehl eine Calculated Property nutzt, um es mit Hilfe der Funktion FromFileTime umzurechnen.

    Liste aller User mit Ablaufdatum für Passwörter und Datum des letztes Kennwortwechsels.

    Inaktive Konten aufspüren

    Eine weitere interessante Abfrage könnte darin bestehen, ob bestimmte Benutzer ihr Kennwort schon längere Zeit nicht mehr geändert haben. Dies könnte neben dem letzten Anmeldedatum ein weiterer Hinweis auf inaktive Konten sein:

    foreach($u in $Users)
    {if($u.PasswordLastSet.addDays(100) -lt (Get-Date)){$u.name}}

    Dieser Befehl filtert alle User aus, die ihr Kennwort seit mehr als 100 Tagen nicht mehr erneuert haben. Aufschluss­reicher dürfte es allerdings sein, wenn man die seitdem verstrichene Zeit ins Verhältnis zur Gültigkeits­dauer von Passwörtern setzt. Diese lässt sich über Get-ADDefaultDomainPasswordPolicy ermitteln:

    $maxPWAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days

    Anschließend kann man diesen Wert zum letzten Änderungsdatum hinzuzählen und schauen, ob das Ergebnis in der Vergangenheit liegt:

    Die im Ergebnis aufgelisteten Benutzer haben somit seit dem Ablauf des Kennworts dieses nicht mehr geändert. Liegt das errechnete Datum weit zurück, dann handelt es sich höchstwahrscheinlich um einen inaktiven Account.

    Benutzer, die ihr Passwort nicht ändern können

    Allerdings kann dabei auch der Fall vorliegen, dass bestimmte User ihr Passwort gar nicht ändern dürfen. Folgender Befehl findet heraus, ob bei solchen Benutzern das Kennwort abgelaufen ist und daher eine Aktion des Administrators erforderlich sein könnte:

    Dieser Aufruf prüft ebenfalls, ob das Ablaufdatum des Kennworts in der Vergangenheit liegt, indem es mit dem aktuellen Datum aus Get-Date vergleichen wird.

    2 Kommentare

    Bild von foo
    foo sagt:
    30. März 2019 - 14:53

    if( [datetime]::FromFileTime($u.'msDS-UserPasswordExpiryTimeComputed').addDays($maxPWAge) -lt (Get-Date))

    Hier addierst du aber zum Ablaufdatum nochmal das maximale Passwortalter hinzu. Das sind nicht alle, deren Passwort abgelaufen ist.

    Wenn meine Policy eine Änderung alle 365 Tage erfordert, dann gibt das da oben alle diejenigen aus, die seit zwei Jahren ihr Kennwort nicht geändert haben (Kennwort ist seit einem Jahr abgelaufen). Wenn man das addDays weglässt, dann bekommt man auch die, bei denen es weniger als ein Jahr abgelaufen ist. Entweder rechnest du vom "zuletzt geändert" aus oder addierst nichts dazu.

    Bild von Wolfgang Sommergut
    30. März 2019 - 18:34

    Korrekt, das ist doppelt gemoppelt. Gedacht war im Anschluss an das vorhergehende Beispiel, die Gültig­keitsdauer zum letzten Änderungsdatum hinzuzurechnen. Das habe ich jetzt gemacht. Danke!