gfaust
Goto Top

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 face-smile )

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

Content-ID: 4587491041

Url: https://administrator.de/contentid/4587491041

Ausgedruckt am: 24.11.2024 um 00:11 Uhr

itisnapanto
itisnapanto 19.01.2024 um 11:57:34 Uhr
Goto Top
Moin,

Sind das Präsentations PCs oder warum so viele Anmeldungen ?
Ich nutze dafür PC Sherrif von Schwarz Software. Verhindert auch das herumfummeln an Auflösung usw.
Nach jedem Neustart ist wieder alles schick.

Gruss
MirkoKR
MirkoKR 19.01.2024 um 12:05:03 Uhr
Goto Top
60 lokale Benutzer🤔
Da scheint wohl am Gesamtkonzept was nicht zu stimmen 🤔
gfaust
gfaust 19.01.2024 um 12:11:30 Uhr
Goto Top
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?
mayho33
mayho33 19.01.2024 um 12:14:41 Uhr
Goto Top
Hi,
Das lässt sich doch wunderbar per Gruppenrichtlinie bewerkstelligen:
learn.microsoft.com
deluserolderthan

Zitat von @MirkoKR:

60 lokale Benutzer🤔
Da scheint wohl am Gesamtkonzept was nicht zu stimmen 🤔
Kommt auf das Konzept an. Shared-PC ist ja nichts ungewöhnliches.
Xaero1982
Xaero1982 19.01.2024 um 12:17:38 Uhr
Goto Top
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?

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.
killtec
killtec 19.01.2024 um 12:23:35 Uhr
Goto Top
Moin,
gibt delpro2 von Helgeklein. Damit kannst du das lösen.

https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/

Gruß
mayho33
mayho33 19.01.2024 um 16:24:03 Uhr
Goto Top
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ß

Zitat von @gfaust:
Hat jemand eine Idee wie man diese auf die schnelle löschen kann ohne extra Software?
Also kein Helge Klein face-smile
Penny.Cilin
Penny.Cilin 19.01.2024 um 16:34:22 Uhr
Goto Top
@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.
mayho33
mayho33 21.01.2024 um 18:43:39 Uhr
Goto Top
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?
Xaero1982
Xaero1982 21.01.2024 um 20:02:50 Uhr
Goto Top
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?

Mitglied seit19.01.2024
Letzter Login19.01.2024

Wird man wohl so schnell nicht mehr sehen face-smile
cse
cse 22.01.2024 um 14:45:46 Uhr
Goto Top
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.
mayho33
mayho33 26.01.2024 um 16:39:17 Uhr
Goto Top
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.

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.
cse
cse 29.01.2024 um 08:16:30 Uhr
Goto Top
ja hehe, ich mach es darüber eher mal unregelmäßig, für große mengen machts keinen sinn.
Penny.Cilin
Penny.Cilin 29.01.2024 um 09:07:26 Uhr
Goto Top
Deswegen nimmt man auch
delprof2
.

Gruss Penny.
gfaust
gfaust 30.01.2024 um 11:38:38 Uhr
Goto Top
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.

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   
  }
}
killtec
killtec 30.01.2024 um 12:02:30 Uhr
Goto Top
Zitat von @gfaust:

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.

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.
colinardo
colinardo 30.01.2024 aktualisiert um 14:12:32 Uhr
Goto Top
Servus.

back-to-topEinfache 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"  

back-to-topErweiterte 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