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. Aufschlussreicher dürfte es allerdings sein, wenn man die seitdem verstrichene Zeit ins Verhältnis zur Gültigkeitsdauer 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.