Artikelbild PowerShell Security

Managing Active Directory (AD) with PowerShell enables efficient automation of administrative tasks such as user and group management, managing computer accounts, and organizational units. PowerShell reduces errors, increases productivity, and provides useful reporting capabilities.

The AD module is available on domain controllers and can be installed via RSAT.

Password reset of all users within an OU

>= to the appropriate post

Get-ADUser -Filter * -SearchBase "OU=XYZ,OU=USER,DC=CONTOSO,DC=LOCAL" | ForEach-Object {Set-ADUser -Identity $_ -PasswordNeverExpires $false -ChangePasswordAtLogon $true}

Export Bitlocker Key from AD as CSV

>= to the appropriate post

Import-module ActiveDirectory
$computers = Get-ADComputer -Filter * -SearchBase "OU=Computers,DC=CONTOSO,DC=LOCAL"
$csvPath = "C:\temp\bitlocker-list-ad.csv"
$output = @()
$output += "HostName, RecoveryPassword"

foreach ($computer in $computers) {
$fetch = $(Get-ADObject -Filter {objectclass -eq 'msFVE-RecoveryInformation'} -SearchBase $computer.DistinguishedName -Properties 'msFVE-RecoveryPassword',whencreated | Sort-Object WhenCreated -Descending).'msFVE-RecoveryPassword'
if (-Not $fetch) {
$output += ($computer.Name,"BitLocker not active") -join ","
}
elseif ($fetch.Count -gt 1) {
$output += ($computer.Name, $fetch[0]) -join ","
}
else {
$output += ($computer.Name, $fetch) -join ","
}
}

$output | Out-File -FilePath $csvPath

Customize display name for multiple users within an OU

>= to the appropriate post

Import-Module ActiveDirectory
$users = Get-ADUser -Filter * -SearchBase "OU=XYZ,OU=USER,DC=CONTOSO,DC=LOCAL" -Properties GivenName, Surname, DisplayName

foreach ($user in $users)
{ if ($user.GivenName -and $user.Surname) 
            {
                $Vorname = $user.GivenName
                $Nachname = $user.Surname
                $NeuerAnzeigename = "$Nachname, $Vorname | NEUER ANZEIGENAME"
                
                # Anzeigename aktualisieren
                Set-ADUser -Identity $user.SamAccountName -DisplayName $NeuerAnzeigename
            } 
  else 
            {        
                Write-Host "Vorname oder Nachname fehlt bei: $($user.SamAccountName)"
            }
}

List unused computer objects in an OU

>= to the appropriate post

Variablen definieren
$OU = "OU=Computer,DC=domain,DC=local" # Pfad zur Ziel-OU
$InaktivitätTage = 90 # Anzahl der Inaktivitätstage
$ExportPfad = "C:\InaktiveComputer.csv" # Speicherort der CSV-Datei

Heutiges Datum und Grenzdatum berechnen
$Heute = Get-Date
$GrenzDatum = $Heute.AddDays(-$InaktivitätTage)

Inaktive Computer sammeln
Write-Host "Suche nach inaktiven Computern in der OU: $OU …"
$InaktiveComputer = Get-ADComputer -SearchBase $OU -Filter * -Properties LastLogonDate |
Where-Object { $_.LastLogonDate -lt $GrenzDatum -and $_.LastLogonDate -ne $null } |
Select-Object Name, @{Name="LastLogonDate"; Expression={($_.LastLogonDate).ToString("yyyy-MM-dd")}}

Ergebnisse anzeigen
if ($InaktiveComputer) {
Write-Host "Gefundene inaktive Computer:"
$InaktiveComputer | Format-Table -AutoSize
# Optional: Ergebnisse exportieren
if ($ExportPfad) {
$InaktiveComputer | Export-Csv -Path $ExportPfad -NoTypeInformation -Encoding UTF8
Write-Host "Ergebnisse wurden in $ExportPfad gespeichert."
}
} else {
Write-Host "Keine inaktiven Computer gefunden."
}

Find users with disabled accounts

>= to the appropriate post

Variablen definieren
$OU = "OU=Users,DC=domain,DC=local" # Pfad zur Ziel-OU
$ExportPfad = "C:\DeaktivierteBenutzer.csv" # Optional: Speicherort der CSV-Datei

Deaktivierte Benutzer finden
Write-Host "Suche nach deaktivierten Benutzerkonten in der OU: $OU …"
$DeaktivierteBenutzer = Get-ADUser -SearchBase $OU -Filter { Enabled -eq $false } -Properties DisplayName, SamAccountName, Enabled |
Select-Object DisplayName, SamAccountName, @{Name="Enabled"; Expression={$_.Enabled}}

Ergebnisse anzeigen
if ($DeaktivierteBenutzer) {
Write-Host "Gefundene deaktivierte Benutzerkonten:"
$DeaktivierteBenutzer | Format-Table -AutoSize
# Optional: Ergebnisse exportieren
if ($ExportPfad) {
$DeaktivierteBenutzer | Export-Csv -Path $ExportPfad -NoTypeInformation -Encoding UTF8
Write-Host "Ergebnisse wurden in $ExportPfad gespeichert."
}
} else {
Write-Host "Keine deaktivierten Benutzerkonten gefunden."
}

View last logon date of all users in an OU

>= to the appropriate post

Variablen definieren
$OU = "OU=Users,DC=domain,DC=local" # Pfad zur Ziel-OU
$ExportPfad = "C:\BenutzerAnmeldedaten.csv" # Optional: Speicherort der CSV-Datei

Benutzer und deren letztes Anmeldedatum abrufen
Write-Host "Suche nach Benutzern und deren letzten Anmeldedaten in der OU: $OU …"
$BenutzerAnmeldedaten = Get-ADUser -SearchBase $OU -Filter * -Properties DisplayName, SamAccountName, LastLogonDate |
Select-Object DisplayName, SamAccountName, @{Name="LastLogonDate"; Expression={($_.LastLogonDate).ToString("yyyy-MM-dd")}}

Ergebnisse anzeigen
if ($BenutzerAnmeldedaten) {
Write-Host "Gefundene Benutzer mit Anmeldedaten:"
$BenutzerAnmeldedaten | Format-Table -AutoSize
# Optional: Ergebnisse exportieren
if ($ExportPfad) {
$BenutzerAnmeldedaten | Export-Csv -Path $ExportPfad -NoTypeInformation -Encoding UTF8
Write-Host "Ergebnisse wurden in $ExportPfad gespeichert."
}
} else {
Write-Host "Keine Benutzer in der angegebenen OU gefunden."
}

Export a user’s group memberships

>= to the appropriate post

Variablen definieren
$BenutzerSamAccountName = "username" # SAM-Account-Name des Benutzers
$ExportPfad = "C:\Gruppenmitgliedschaften.csv" # Optional: Speicherort der CSV-Datei

Gruppenmitgliedschaften abrufen
Write-Host "Suche nach Gruppenmitgliedschaften des Benutzers: $BenutzerSamAccountName …"
$Gruppen = Get-ADUser -Identity $BenutzerSamAccountName -Properties MemberOf |
Select-Object -ExpandProperty MemberOf |
ForEach-Object { (Get-ADGroup -Identity $_).Name }

Ergebnisse anzeigen
if ($Gruppen) {
Write-Host "Gefundene Gruppenmitgliedschaften:"
$Gruppen | Format-Table -AutoSize
# Optional: Ergebnisse exportieren
if ($ExportPfad) {
$Gruppen | ForEach-Object { [PSCustomObject]@{GroupName = $_} } | Export-Csv -Path $ExportPfad -NoTypeInformation -Encoding UTF8
Write-Host "Ergebnisse wurden in $ExportPfad gespeichert."
}
} else {
Write-Host "Keine Gruppenmitgliedschaften gefunden oder Benutzer existiert nicht."
}

This post is also available in: Deutsch English