Weisheiten - der Netz-Weise Blog
Inaktive Benutzer oder Computer mit Powershell finden und deaktivieren
Das Cmdlet Search-ADAccount ist das Schweizer Messer des AD-Administrators. Es zeigt gesperrte Konten genauso an wie deaktiviert Konten, ablaufende Konten und Konten, deren Kennwort niemals abläuft. Der vielleicht hilfreichste Parameter ist aber -AccountInactive, der Konten anzeigt, die sich schon lange nicht mehr in der Domäne angemeldet haben. Grundsätzlich kann man dieses auch mit Get-ADUser und Get-ADComputer lösen, aber das ist aufwändiger und außerdem muß man auch darauf achten, welches AD-Attribut man auswertet, denn es gibt mehrere Eigenschaften, die die letzte Anmeldung speichern, aber nicht alle sind gleich gut geeignet. Eine gute Auflistung der Attribute und deren Unterschiede finden Sie im Technet-Wiki.
Um inaktive Konten anzuzeigen, nutzen Sie einfach
Search-ADAccount -AccountInactive
Der Parameter findet sowohl Benutzer- als auch Computerkonten, die sich seit 60 Tagen nicht mehr angemeldet haben. Wenn Sie nur Benutzer suchen, verwenden Sie den Parameter -Usersonly, wenn Sie die Zeitspanne angeben wollen, benutzen Sie den Parameter Timespan, gefolgt von den Tagen seit dem letzten Login:
Search-ADAccount -AccountInactive -TimeSpan 90 -UsersOnly
Um das ganze praktisch problemlos einsetzen zu können, habe ich eine kleine Funktion gebastelt, die alle inaktiven Konten deaktiviert, in eine eigene OU verschiebt, und das Beschreibungsfeld des Kontos verwendet, um den Ursprungsort und das Datum des Verschiebens zu dokumentieren. So können Sie alte Konten sicher deaktivieren und archivieren, ohne den Kollegen mitsamt seinem PC aus Ihrem AD zu entfernen, der sich gerade im Sabbatjahr oder in Elternzeit befindet. Die verschobenen Konten werden in einer csv-Datei protokolliert.
{
<#
.SYNOPSIS
Finds inactive Accounts, comments and disables them and moves them into an OU for disabled Accounts
This Function uses Search-ADAccount to find inactive Accounts. It moves inactive Accounts to a special
OU, disables them and comments the day and the original OU in the comment-Field of the Account.
All moved accounts are documented in a csv-File for reference. The system-Accounts guest,krbtgt and Default Account
are not touched.
The OU where disabled accounts are moved to
The CSV-File which is created to document which accounts where touched.
Add Additional Accounts which shall be ignored beside the system-accounts
User,Computer or all defines which accounts shall be examined.
Move-InactiveAccounts -TargetOU "OU=Inactive,DC=netz-weise,dc=de" -logFilePath c:\log\disabledUsers.csv -AccountsToIgnore 'admin' -AccountType User
Describe what this call does
Author: Holger Voge
Website: www.Netz-Weise-it.Training
Date: 23.04.2017
Version: 1.0
#>
param
(
[String]
[Parameter(Mandatory)]
[string]
$TargetOU = 'DisabledAccounts',
[Parameter()]
[string]$logFilePath = "$env:temp\DisabledUsers.csv",
[string]$AccountType = "user",
[int]$InactivityDays = 90
)
$TargetOUDN = "OU=$TargetOU,$domainDN"
$ExcludeAccounts = 'Krbtgt','guest','DefaultAccount','administrator',$AccountsToIgnore
$Null = Get-ADOrganizationalUnit -Identity $TargetOUDN
}
Catch [Microsoft.ActiveDirectory.Management.ADIdentityResolutionException] {
Return "Die übergebene OU existiert nicht"
}
Where-Object { ( $_.Name -notin $ExcludeAccounts ) -and ( $_.DistinguishedName -notlike "*$TargetOUDN" ) }
{
$description = ( Get-ADObject -Identity $InactiveAccount.DistinguishedName -Properties Description ).description
$description = "{0}`nOrigin: {1}`nMoveDate: {2}" -f $description,$InactiveAccount.DistinguishedName,(get-date -Format yyyy-MM-dd)
Set-ADObject -Identity $InactiveAccount.DistinguishedName -Description $description
Disable-ADAccount -Identity $InactiveAccount -PassThru | Move-ADObject -TargetPath $TargetOUDN
$InactiveAccount | Select-Object name,distinguishedName,LastLogonDate,Description,@{ name="Movedate";expression={get-date -Format "yyyy-MM-dd hh-mm-ss"}} |
export-CSV -Path $logFilePath -UseCulture -Encoding UTF8 -NoTypeInformation -Append
}
"Die Protokolldatei wurde unter $logFilePath gespeichert"
}
Kommentare