Im Rahmen einer Entstörung von AD-Benutzeraccounts benötigte ich die aktuelle Passwort-Daten beim Anruf der Benutzer. Dazu habe ich mir ein kleines Skript geschrieben. Dieses berücksichtigt die folgenden Szenarien:
- AD-Benutzer gibt es nicht
- AD-Benutzer ist deaktiviert
- AD-Benutzer hat ein Ablaufdatum und dieses ist überschritten
- AD-Benutzer muss sein Kennwort bei der nächsten Anmeldung ändern
- AD-Benutzer hat keinen Passwort-Ablauf
- AD-Benutzer ist gesperrt
Wenn dieses alles nicht zutrifft werden folgende 2 Definitionen zur Berechnung des Passwortalters herangezogen:
- AD-Benutzer nutzt die Default Domain Policy
- AD-Benutzer nutzt eine Fine-grained Password Policy
Import-Module ActiveDirectory -Force If ($args) { $Userlogin = $args[0] } else { Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $form = New-Object System.Windows.Forms.Form $form.Text = 'Passwort-Display' $form.Size = New-Object System.Drawing.Size(300,200) $form.StartPosition = 'CenterScreen' $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Point(75,120) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = 'OK' $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $OKButton $form.Controls.Add($OKButton) $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Point(150,120) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = 'Cancel' $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $CancelButton $form.Controls.Add($CancelButton) $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10,20) $label.Size = New-Object System.Drawing.Size(280,20) $label.Text = 'Bitte sAMAccountName eingeben:' $form.Controls.Add($label) $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Point(10,40) $textBox.Size = New-Object System.Drawing.Size(260,20) $form.Controls.Add($textBox) $form.Topmost = $true $form.Add_Shown({$textBox.Select()}) $result = $form.ShowDialog() if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $Userlogin = $textBox.Text } if ($result -eq [System.Windows.Forms.DialogResult]::Cancel) { exit } } $Usercheck = Get-Aduser -filter {samaccountname -eq $userlogin} If ($usercheck -eq $NULL) { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [System.Windows.Forms.MessageBox]::Show("Der Benutzer existiert nicht.","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Error) exit } $employee = Get-AdUser $Userlogin -Properties enabled,PasswordNeverExpires,PasswordLastSet,Displayname,LockedOut,"msDS-UserPasswordExpiryTimeComputed",AccountExpirationDate If ($employee.enabled -like "False") { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [System.Windows.Forms.MessageBox]::Show("Benutzer "+$employee.displayname+" ist deaktiviert","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Error) exit } If (($employee.AccountExpirationDate) -eq $null) { } else { $Ablaufdatum = ((get-date) - ($employee.AccountExpirationDate)) $Ablauftage=$Ablaufdatum.days If ($Ablauftage -gt "0") { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+ "Ablaufdatum des Accounts: "+$employee.AccountExpirationDate,"User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Error) exit } } If ($employee.PasswordLastSet -eq $null) { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Das Passwort des Accounts muss bei der nächsten Anmeldung geändert werden.","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Error) exit } If ($employee.passwordneverexpires -like "True") { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Das Passwort des Accounts läuft nicht ab.","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Error) exit } If ($employee.LockedOut -like "True") { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Der Account ist gesperrt.","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Error) exit } $FGPP=(Get-ADUserResultantPasswordPolicy $Userlogin) If($fgpp.name -eq $null) { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $expireDate=((Get-adUser($Userlogin) -Properties PassWordLastSet).PasswordLastSet + (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Ticks) $daysleft=($expireDate-(get-date)).Days if($daysleft-le "0") { $daysnegative =-$daysleft [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Regelwerk: Default Domain Policy `n`n"+"Das Passwort ist seit "+<span style="display: inline !important; float: none; background-color: transparent; color: #2b2b2b; cursor: text; font-family: 'Philosopher',sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">$daysnegative</span>+" Tagen abgelaufen. `n`n"+"Genauer Zeitstempel: "+$expireDate+"","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Warning) } else{ [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Regelwerk: Default Domain Policy `n`n"+"Das Passwort muss in "+$daysleft+" Tagen geändert werden. `n`n"+"Genauer Zeitstempel: "+$expireDate+"","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Information) } exit } else{ [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $expireDate=((Get-adUser($Userlogin) -Properties PassWordLastSet).PasswordLastSet + (Get-ADUserResultantPasswordPolicy -Identity $Userlogin).MaxPasswordAge.Ticks) $daysleft=($expireDate-(get-date)).Days if($daysleft-le "0") { $daysnegative =-$daysleft [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Regelwerk: "+$fgpp.Name+" `n`n"+"Das Passwort ist seit "+$daysnegative+" Tagen abgelaufen. `n`n"+"Genauer Zeitstempel: "+$expireDate+"","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Warning) } else{ [System.Windows.Forms.MessageBox]::Show("Benutzer: "+$employee.displayname+" `n`n"+"Regelwerk: "+$fgpp.Name+" `n`n"+"Das Passwort muss in "+$daysleft+" Tagen geändert werden. `n`n"+"Genauer Zeitstempel: "+$expireDate+"","User " +$Userlogin,0,[System.Windows.Forms.MessageBoxIcon]::Information) } exit
Damit die Daten ordnungsgemäß abgefragt werden können, benötigt der Ausführende die Leseberechtigungen auf den Container „Password Setting Objects“ im System-Ordner der Domäne.
Das Skript kann per GUI sowie per Skript gestartet werden.