Lokale Benutzer in Windows im Stapel löschen
Hallo
ich würde gerne Windows 10 und Windows 11 Benutzer im Stapel löschen.
Es sollen alle Benutzer bis z.B. Administrator, Guest ... und (dem aktuell angemeldetem Benutzer gelöscht werden, die älter als 30 Tage alt sind)*
*(wenn diese Teil möglich ist )
Gelöscht werden sollen alle Registry-Einträge als die zugehörigen Verzeichnisse im "C:\Users\" Pfad.
Hat jemand eine Idee wie ich das mit einem Script wie z.B. PowerShell umsetzten kann?
Leider geht das nicht mit Windows Bordmitteln.
60 Benutzer mit der Hand zu löschen ist einfach aufwendig.
Vielleicht hat jemand eine Idee.
Über ein positives Feedback würde ich mich sehr freuen.
Gruß
Guido
ich würde gerne Windows 10 und Windows 11 Benutzer im Stapel löschen.
Es sollen alle Benutzer bis z.B. Administrator, Guest ... und (dem aktuell angemeldetem Benutzer gelöscht werden, die älter als 30 Tage alt sind)*
*(wenn diese Teil möglich ist )
Gelöscht werden sollen alle Registry-Einträge als die zugehörigen Verzeichnisse im "C:\Users\" Pfad.
Hat jemand eine Idee wie ich das mit einem Script wie z.B. PowerShell umsetzten kann?
Leider geht das nicht mit Windows Bordmitteln.
60 Benutzer mit der Hand zu löschen ist einfach aufwendig.
Vielleicht hat jemand eine Idee.
Über ein positives Feedback würde ich mich sehr freuen.
Gruß
Guido
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4587491041
Url: https://administrator.de/contentid/4587491041
Ausgedruckt am: 24.11.2024 um 00:11 Uhr
17 Kommentare
Neuester Kommentar
Hi,
Das lässt sich doch wunderbar per Gruppenrichtlinie bewerkstelligen:
learn.microsoft.com
Kommt auf das Konzept an. Shared-PC ist ja nichts ungewöhnliches.
Das lässt sich doch wunderbar per Gruppenrichtlinie bewerkstelligen:
learn.microsoft.com
Kommt auf das Konzept an. Shared-PC ist ja nichts ungewöhnliches.
Zitat von @gfaust:
Die PCs werden von diversen Benutzern genutzt. Jedes anmelden übers AD erzeugt einen neuen lokalen Benutzer.
Soweit OK
Hat jemand eine Idee wie man diese auf die schnelle löschen kann ohne extra Software?
Die PCs werden von diversen Benutzern genutzt. Jedes anmelden übers AD erzeugt einen neuen lokalen Benutzer.
Soweit OK
Hat jemand eine Idee wie man diese auf die schnelle löschen kann ohne extra Software?
Seit wann erzeugt es denn einen lokalen Nutzer, wenn sich ein Domänenbenutzer anmeldet? DAS wäre mir neu.
Es wird nur ein Profil angelegt und das kann man wie @mayho33 schreibt über GPO regeln.
Moin,
gibt delpro2 von Helgeklein. Damit kannst du das lösen.
https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/
Gruß
gibt delpro2 von Helgeklein. Damit kannst du das lösen.
https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/
Gruß
Zitat von @killtec:
Moin,
gibt delpro2 von Helgeklein. Damit kannst du das lösen.
https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/
Gruß
Moin,
gibt delpro2 von Helgeklein. Damit kannst du das lösen.
https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/
Gruß
Zitat von @gfaust:
Hat jemand eine Idee wie man diese auf die schnelle löschen kann ohne extra Software?
Also kein Helge Klein Hat jemand eine Idee wie man diese auf die schnelle löschen kann ohne extra Software?
@gfaust
Ist ja schön, daß Deine Frage als Gelöst markiert ist.
Was war denn die Lösung, falls ein andrer Forumsteilnehmer die gleiche Frage hat?
Gruss Penny.
Ist ja schön, daß Deine Frage als Gelöst markiert ist.
Was war denn die Lösung, falls ein andrer Forumsteilnehmer die gleiche Frage hat?
Gruss Penny.
Wäre ja echt nett @gfaust wenn du jene mit einem "zur Lösung beigetragen" beglückst, die dir bei der Lösung geholfen haben.
Ein abschließender Kommentar wäre auch nett:
Wie kann ich einen Beitrag auf "gelöst" oder "erledigt" setzen?
Ein abschließender Kommentar wäre auch nett:
Wie kann ich einen Beitrag auf "gelöst" oder "erledigt" setzen?
Zitat von @mayho33:
Wäre ja echt nett @gfaust wenn du jene mit einem "zur Lösung beigetragen" beglückst, die dir bei der Lösung geholfen haben.
Ein abschließender Kommentar wäre auch nett:
Wie kann ich einen Beitrag auf "gelöst" oder "erledigt" setzen?
Wäre ja echt nett @gfaust wenn du jene mit einem "zur Lösung beigetragen" beglückst, die dir bei der Lösung geholfen haben.
Ein abschließender Kommentar wäre auch nett:
Wie kann ich einen Beitrag auf "gelöst" oder "erledigt" setzen?
Mitglied seit19.01.2024
Letzter Login19.01.2024
Wird man wohl so schnell nicht mehr sehen
ma abjesehen von der GPO, kann man die auch easy händisch löschen (achtung nicht einfach die ordner unter c:\user löschen).
systemsteuerung --> system --> info --> auf der rechten seite "erweiterte systemeinstellung" --> reiter erweitert --> benutzerprofile --> in der liste user markieren und löschen.
systemsteuerung --> system --> info --> auf der rechten seite "erweiterte systemeinstellung" --> reiter erweitert --> benutzerprofile --> in der liste user markieren und löschen.
Zitat von @cse:
ma abjesehen von der GPO, kann man die auch easy händisch löschen (achtung nicht einfach die ordner unter c:\user löschen).
systemsteuerung --> system --> info --> auf der rechten seite "erweiterte systemeinstellung" --> reiter erweitert --> benutzerprofile --> in der liste user markieren und löschen.
ma abjesehen von der GPO, kann man die auch easy händisch löschen (achtung nicht einfach die ordner unter c:\user löschen).
systemsteuerung --> system --> info --> auf der rechten seite "erweiterte systemeinstellung" --> reiter erweitert --> benutzerprofile --> in der liste user markieren und löschen.
Kann man so machen, ist aber eher mühsam und um so mühsamer, wenn man das zyklisch tun will und vielleicht bei dutzenden, 100en oder gar 1000en Clients.
Ich vertrete die Philosophie: sei faul und automatisiere, dann hast du Zeit für wichtige Dinge.
Zitat von @gfaust:
Hallo Penny,
meine PowerShell Lösung:
Zitat von @Penny.Cilin:
@gfaust
Ist ja schön, daß Deine Frage als Gelöst markiert ist.
Was war denn die Lösung, falls ein andrer Forumsteilnehmer die gleiche Frage hat?
Gruss Penny.
@gfaust
Ist ja schön, daß Deine Frage als Gelöst markiert ist.
Was war denn die Lösung, falls ein andrer Forumsteilnehmer die gleiche Frage hat?
Gruss Penny.
Hallo Penny,
meine PowerShell Lösung:
# Listet alle Benutzer in C:\Users auf
$users = Get-ChildItem -Path C:\Users | Where-Object { $_.PSIsContainer }
# Löscht die Benutzerverzeichnisse und die entsprechenden Registry-Einträge für alle Benutzer, die nicht in der Ausnahmeliste enthalten sind
foreach ($user in $users) {
if ($user.Name -ne "Administrator" -and $user.Name -ne "DefaultAccount" -and $user.Name -ne "Gast" -and $user.Name -ne "TEMP" -and $user.Name -ne "Guest" -and $user.Name -ne "WDAGUtilityAccount" -and $user.Name -ne "Public" -and $user.Name -ne "Default" -and $user.Name -ne $env:USERNAME) {
Remove-Item -Path $user.FullName -Recurse -Force
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$($user.Name)" -Name ProfileImagePath -Force
}
}
Ohne es zu Prüfen behaupte ich dass der Code die Registry-Schlüssel nicht korrekt löscht da in der Registry die User als SID stehen und nicht als named.
Servus.
Anwendung der Funktion mittels Angabe des DNs der berücksichtigten Gruppen von denen die User Mitglied sind und die Zeit in Tagen nach dem das Profil entfernt wird.
Grüße Uwe
Einfache Variante:
function Remove-LocalUserProfiles {
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[parameter(mandatory=$false)][string[]]$exclude,
[parameter(mandatory=$true)][datetime]$olderthan
)
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){
write-error "CMDLet needs to be run with elevated permission!" -Category PermissionDenied
return
}
# adjust privilege token (add BackupPrivilege tokens)
Add-Type –MemberDefinition '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege | out-null
9,17,18 | %{[privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0) | out-null}
# eumerate local non special user profiles older than date and not in exclude list
foreach($userprofile in Get-CimInstance win32_Userprofile | ?{!$_.Special -and !$_.Loaded -and $_.LastUseTime -lt $olderthan -and (New-Object System.Security.Principal.SecurityIdentifier([string]$_.Sid)).Translate([System.Security.Principal.NTAccount]).Value.split('\')[-1] -notin $exclude}){
# if action should take place
if($PSCmdlet.ShouldProcess($userprofile.SID,"Remove profile and data")){
# remove user profile
$userprofile | Remove-CimInstance
# remove profile data folder
remove-item $userprofile.LocalPath -Recurse -force
}
}
}
Remove-LocalUserProfiles -olderthan (get-date).AddDays(-30) -exclude "Administrator"
Erweiterte Variante mit der sich anhand von AD-Gruppenzugehörigkeiten der User verschiedene Zeiten Aufbewahrungszeiten festlegen lassen:
function Remove-LocalUserProfiles {
[cmdletbinding(SupportsShouldProcess=$true,ConfirmImpact="High")]
param(
[Parameter(mandatory=$true)][hashtable]$GroupSettings
)
begin {
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){
write-error "CMDLet needs to be run with elevated permission!" -Category PermissionDenied
break
}
# adjust privilege token (add BackupPrivilege tokens)
Add-Type –MemberDefinition '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege | out-null
9,17,18 | %{[privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0) | out-null}
# create ad searcher object
$searcher = [adsisearcher]''
# specify properties to load
[void]$searcher.PropertiesToLoad.AddRange(@('cn','memberOf','primaryGroupID'))
# get userprofiles without special ones
$userprofiles = Get-CimInstance win32_Userprofile | ?{!$_.Special -and !$_.Loaded}
}
process{
foreach ($profile in $userprofiles){
# set adsisearcher filter
$searcher.Filter = "(&(objectCategory=User)(objectSid=$($profile.SID)))"
# get ad user object
$aduser = $searcher.FindOne()
# if no ad user found skip profile
if (!$aduser){continue}
# check group membership
$grp = $GroupSettings.GetEnumerator() | ?{$_.Key -in $aduser.Properties['memberOf'] -or [System.Security.Principal.SecurityIdentifier]::new(([adsi]"LDAP://$($_.Key)").objectSID[0],0).Value.split('-')[-1] -eq $aduser.Properties['primaryGroupID'][0]} | select -F 1
if (!$grp){continue}
if ($profile.LastUseTime -lt (get-date).AddDays($grp.Value.Days)){
if ($PSCmdlet.ShouldProcess($aduser.Properties['cn'],"Remove user profile")){
Write-Verbose "Removing profile for SID '$($_.SID)'"
# remove userprofile
$profile | Remove-CimInstance
if (Test-Path $profile.LocalPath){
# remove profile path
remove-item $profile.LocalPath -Recurse -Force
}
}
}
}
}
end{}
}
Anwendung der Funktion mittels Angabe des DNs der berücksichtigten Gruppen von denen die User Mitglied sind und die Zeit in Tagen nach dem das Profil entfernt wird.
Remove-LocalUserProfiles -GroupSettings @{'CN=Domänen-Benutzer,CN=Users,DC=domain,DC=de' = @{Days = -30}}
Grüße Uwe