Alte Benutzerprofile per Powershell löschen
Zur Löschung von alten Benutzerprofilen kann man unter Windows auch eine Gruppenrichtlinie einsetzen. Aber die Gruppenrichtlinie unterscheidet nicht zwischen normalen, administrativen oder technischen Konten. Powershell-Skripte wie “Delete User Profiles Remotely” oder “Deletes user profiles if they do not exist in Active Directory” sind gute Alternativen zur gezielten Löschung.
Computer Configuration → Administrative Templates → System → User Profiles
Aus diesem Grund arbeite ich an dieser Stelle entweder mit einem Windows-Task und einer Liste von Mitarbeitern die das Unternehmen verlassen haben (Off-Boarding), oder manuell per Invoke-Command.
Delete User Profiles Remotely
Die manuelle Löschung, gerade dann, wenn es sich um administrative Benutzer handelt, sollte unverzüglich starten.
Für die Löschung von alten Benutzerkonten gibt es unterschiedliche Gründe. Zum einen aus dem Aspekt des Datenschutzes (Aufbewahrungs- oder Löschfristen) heraus, oder aber auch zur Optimierung der Festplattenkapazität.
Hier ein Beispiel-Skript für die manuelle Löschung per Invoke-Command. Es müssen lediglich die zu löschenden Benutzerkonten angegeben werden, so wie die Server auf denen die Konten gelöscht werden sollen.
Delete User Profiles Remotely
# https://www.windows-papst.de
$Users = “AGMP”,”Benutzer1″,”Joern”
$Computers = “CL2”,”CL1“
foreach ($User in $Users) {
foreach ($Computer in $Computers) {
Invoke-Command -ComputerName $computer -ScriptBlock {
param($user)
$localpath = ‘C:\Users\’ + $user
Get-WmiObject -Class Win32_UserProfile | Where-Object {$_.LocalPath -eq $localpath} |
Remove-WmiObject
} -ArgumentList $user
}}
Vor der Löschung:
Nach der Löschung:
Download-Skript:
Delete User profiles remotely
Dieses Skript kann man z.B. auf Domain Controllern einsetzen. Das Skript löscht aber nur die Benutzerprofile, deren Objekte im Active Directoy bereits gelöscht wurden. Auch hier wird eine Liste eingesetzt, die per Powershell eingelesen wird. Zusätzlich werden Event-Logs geschrieben.
Deletes user profiles if they do not exist in Active Directory
# https://www.windows-papst.de
If ([System.Diagnostics.EventLog]::SourceExists(‘DeleteUserProfiles’) -eq $False) {
New-EventLog -LogName Application -Source ‘DeleteUserProfiles’
}
$UserList = Get-Content -Path ‘\\windowspapst.de\Netlogon\Deleteprofiles.txt’
foreach ($User in $UserList) {
try {
Get-ADUser -Identity $User -ErrorAction Stop | Out-Null
Write-Host “User $User exists in AD and will not be deleted” -ForegroundColor Green
Write-EventLog –LogName Application –Source “DeleteUserProfiles” -EntryType Information -EventID 0 -Message “User $User exists in AD and will not be deleted”
continue
} catch {
if(-not (Test-Path “C:\Users\$User”)){
Write-Host “The localpath from User $User has already been deleted” -ForegroundColor Cyan
Write-Output “The localpath from User $User has already been deleted on Server $env:computername” >> ‘\\windowspapst.de\Netlogon\DeleteprofilesLog.txt’
Write-EventLog –LogName Application –Source “DeleteUserProfiles” -EntryType Information -EventID 1 -Message “The localpath from User $User has already been deleted on Server $env:computername”
}
else {
Write-Host “User [$User] does not exists in AD and will be deleted.” -ForegroundColor Red
$Del=Get-WmiObject Win32_UserProfile -filter “localpath=’C:\\Users\\$User'”
$Del.Delete()
Write-Output “User [$User] does not exists in AD and will be deleted on Server $env:computername” >> ‘\\windowspapst.de\Netlogon\DeleteprofilesLog.txt’
Write-EventLog –LogName Application –Source “DeleteUserProfiles” -EntryType Warning -EventID 2 -Message “User [$User] does not exists in AD and will be deleted on Server $env:computername”
}
}
}
Download-Skript:
Deletes user profiles if they do not exist in Active Directory