Profilsäuberung automatisieren per powershell

nex86

Captain
Registriert
Okt. 2011
Beiträge
3.726
Ich müsste nächste Woche eine ganze Reihe von Rechnern säubern..
dabei wollte ich das ganze per powershell scripts vereinfachen..
undzwar soll das alte Profil restlos samt benutzerordner gelöscht werden und neu erstellt.
Habe da schon ein Script zusammengestellt, allerdings wird der Benutzerordner in einigen Fällen nicht komplett gelöscht und ich muss ihn danach im Explorer noch händig löschen da reste übrig bleiben...
Das möchte ich verhinden.
Ausserdem möchte ich dass bei der erstellung des neuen Profils der Assistent mit den Datenschutzfragen unterdrückt wird und alle automatisch verneint werden, so dass ich nur das Profil lade und ohne Benutzereingaben auf dem Desktop lande.

Wie lässt sich sowas bewerkstelligen??
Hier einmal soweit das Script:

Code:
$ErrorActionPreference = "SilentlyContinue"

function Remove-LocalUserCompletely {

    Param(
        [Parameter(ValueFromPipelineByPropertyName)]
        $Name
    )

    process {
        $user = Get-LocalUser -Name $Name -ErrorAction SilentlyContinue

        # Remove the user from the account database
        Remove-LocalUser -SID $user.SID

        # Remove the profile of the user (both, profile directory and profile in the registry)
        Get-CimInstance -Class Win32_UserProfile | ? SID -eq $user.SID | Remove-CimInstance
    }
}

# Example usage:
Write-Output "Benutzer und Daten werden gelöscht... Bitte warten..."
Remove-LocalUserCompletely -Name 'Schule' -ErrorAction SilentlyContinue
Remove-LocalUserCompletely -Name 'schule' -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schule\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schule\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schule" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schule" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schule*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schule-*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schule*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schule-*" -recurse -force -ErrorAction SilentlyContinue

Remove-LocalUserCompletely -Name 'Schüler' -ErrorAction SilentlyContinue
Remove-LocalUserCompletely -Name 'schüler' -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schüler\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schüler" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schüler*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schüler-*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler-*" -recurse -force -ErrorAction SilentlyContinue
Write-Output "-------------------------------------------------"
Write-Output "prefetch wird gelöscht.."
Write-Output "-------------------------------------------------"
Remove-item "C:\Windows\Prefetch\*" -recurse -force -ErrorAction SilentlyContinue
dir C:\Windows\Prefetch
Write-Output "-------------------------------------------------"
Write-Output "Noch vorhandene Profilordner:"
Write-Output "-------------------------------------------------"
Write-Output "Bitte Überprüfen ob Userfolder und User gelöscht"
Write-Output "Falls nicht, im Explorer Manuell löschen."
Write-Output "Danach Enter Drücken um fortzufahren."
Write-Output "-------------------------------------------------"
Write-Output "Noch vorhandene Profilordner:"
dir C:\Users
Get-LocalGroupMember -Group "Benutzer"
Get-WmiObject -Class Win32_UserProfile | Where-Object {$_.Special -ne 'Special'} | Select-Object LocalPath, Loaded
Write-Output "-------------------------------------------------"
Write-Output "Bitte erst fortsetzen wenn Profil und Profilordner Schule komplett gelöscht ist."
pause
Write-Output "Erstelle neues Profil..."
New-LocalUser -Name "Schule" -PasswordNeverExpires -AccountNeverExpires -UserMayNotChangePassword
Enable-LocalUser -Name "Schule"
Add-LocalGroupMember -Group "Benutzer" -Member "Schule"
Write-Output "-------------------------------------------------"
Write-Output "Bitte Überprüfen ob User Schule neu erstellt"
Write-Output "-------------------------------------------------"
Get-LocalGroupMember -Group "Benutzer"
pause
logoff
 
Naja, ohne das im Detail geprüft zu haben:

mit erroraction SilentlyContinue bezweickst du ja eben ganau, dass er Fehler nicht anzeigt.

Ich würde halt mal mit Test-Path bzw. Get-Childitem prüfen, ob dein Löschen erfolgreich ist und dann mit Try Catch Probleme weiterbehandeln.

Ohne genau zu wisse, wo die Fehler herkommen wirds schwer darauf eine pauschale Antwort zu geben.
 
pizza4ever schrieb:
Try Catch Probleme weiterbehandeln.
musst du mir erklären was du damit genau meinst..
pizza4ever schrieb:
Ohne genau zu wisse, wo die Fehler herkommen wirds schwer darauf eine pauschale Antwort zu geben.
ja das kann ich auch leider nur sehen wenn ich schon vor ort bin aber da muss das ganze schon fertig sein und laufen.
Bei meinen Tests Zuhause und im Büro wurden die Profilordner immer anstandslos gelöscht.
Gibt es keinen weg die Ordner restlos zu löschen?
und wenn irgendwas blockiert ist oder wo ein zugriff verweigert wird da gibts doch immer die möglichkeiten die Rechte rekursiv zu ändern, habe sowas allerdings noch nie über CMD oder powershell gemacht.
 
Mach mal die Erroractions weg, bau um das ganze eine While Schleife und schau wo es hängt...

Außerdem hast du irrsinnig viele sinnlose Zeilen

Code:
Remove-item "C:\Users\Schüler\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schüler" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler" -recurse -force -ErrorAction SilentlyContinue

ist nämlich das gleiche wie
Code:
Remove-item "C:\Users\Schüler" -recurse -force

(die Erroraction hat da m.E. nach nichts verloren)

und dann würde ich mal folgendes bauen

Code:
$folder = 'C:\Users\Schüler'
Remove-item $folder -recurse -force
if (Test-Path $folder){
echo "$folder konnte nicht gelöscht werden. Bitte prüfen"
exit
}
und dann wartest du mal, bis das Skript crasht und schaust dir an, warum der Befehl nicht funktioniert hat. Wenns über den Explorer geht, liegt die Vermutung nahe dass irgendwas das Löschen verhindert, dann würde ich mir das ganze in eine Schleife bauen

Code:
$folder = 'C:\Users\Schüler'
while (Test-Path $folder){
Remove-item $folder -recurse -force
}

Achtung, das ganze ist eine Endlosschleife und wird bei richtigen Problemen wie z.B. mangelnden Rechten zu einer Endlosschleife.

.. aber wie gesagt, ohne genaue Anforderung schwierig zu beurteilen
 
ok danke versuche ich,
Dann noch zu dem assistenten und den Datenschutzfragen, wie mache ich das?
 
Aus dem Bauch raus würde ich sagen, dass das nur durch die Vordertür geht indem man ihn mit Antworten füttert. Grund für die Annahme ist, dass ja dieses ein sehr… empfindliches… Kapitel ist durch das ein Installierender durch muss.

Allerdings ist mir dein ganzes Tun nicht recht erklärlich.
Ein User ›selbst‹ müsste sich durch die Vordertür löschen lassen, und dann eigentlich auch der Profilordner. Gut. Aber warum (Folgerung willst du den selben User faktisch neu anlegen? Das ist kein übliches Tun, eher würde man ein Startimage bemühen - passend gestickt mit Verwaltungsuser ›gut im Futter‹ und dem nackten, neu angelegten User Namens XY.
Wenn man durchfegen will (das scheint mir so) würde ich anders ansetzen. Wenn es mehr Optik ist genügt es den User offiziell zu löschen und wieder anzulegen. Bastler könnten raussuchen wo die Datenschutzeinstellungen liegen, das exportieren und für den neuen User importieren wenn denn beim anlegen der ›Neue‹ nicht durch den Prozess durch muss.

CN8
 
  • Gefällt mir
Reaktionen: pizza4ever
ich tue das um die Rechner schnell zu säubern..
ich möchte keine Stunde vor jedem Rechner hocken und das sind an die 70 stück, die meisten ausgestattet mit nem Core i3 der ersten generation und superlahmen festplatten....
alleine der boot vorgang und das profil zu wechseln dauert an die 10 minuten.
 
Siebzig!!!
Meine Güte - da hat man Images für, auf bootfähigen Sticks (Notfallstick des Imagetools) selbst oder Stick + billigen USB-Platten und hüpft in Gruppen von System zu System!
Dass man die Images (eines, das man dann entsprechend kopiert) pflegt ist wohl klärchen. Aber so eine Skripteritis?

OK, praktische Frage - wie sauber muss das sein, für Kurse in einer VHS oder so, normale Schule? Einmal die Woche, einmal im Monat? Ich denke: wirklch sauber.(*)

Corei3… Ich lüge über das was ich rumstehen habe auf dem was von »für Vista« steht (Laptops) aber 20 Öcken für SSDs wären eine Investition die so viel Arbeitszeit spart, dass das ‹schlürf› wieder drin ist!
Falls Laptops - man kann an Schräubchen drehen und man kann die weglassen (hüstel) um die Platten halt außerhalb aufzubereiten → würde Adapter für USB brauchen; aber bei 70 artet das ebenso aus wie das Hüpfen von Rechner zu Rechner.

CN8
Mancher nennt mich stinkfaul - ich nenn’s Energie sparen… 😉 Wenns einfacher ginge als mit Image würde ich das wohl so tun.

(*) unter XP spätestens konnte man noch User auf dem System kopieren/klonen, das wurde abgeschafft. Danke, MS, danke!!!
 
sind alte Desktop rechner, und images.. haben wir schon probiert, mit acronis dauert das zurückspielen weitaus länger als mit dem script das profil zu löschen und neu zu erstellen...
Aber im prinzip werden die rechner nur für internet und bisschen office gebraucht.
geplant ist aber für die Zukunft eine cloud lösung mit Raspberry PIs, aber das ist alles noch Zukunftsmusik..
 
pizza4ever schrieb:
Mach mal die Erroractions weg, bau um das ganze eine While Schleife und schau wo es hängt...

Außerdem hast du irrsinnig viele sinnlose Zeilen

Code:
Remove-item "C:\Users\Schüler\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler\*" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\Schüler" -recurse -force -ErrorAction SilentlyContinue
Remove-item "C:\Users\schüler" -recurse -force -ErrorAction SilentlyContinue

ist nämlich das gleiche wie
Code:
Remove-item "C:\Users\Schüler" -recurse -force

(die Erroraction hat da m.E. nach nichts verloren)

und dann würde ich mal folgendes bauen

Code:
$folder = 'C:\Users\Schüler'
Remove-item $folder -recurse -force
if (Test-Path $folder){
echo "$folder konnte nicht gelöscht werden. Bitte prüfen"
exit
}
und dann wartest du mal, bis das Skript crasht und schaust dir an, warum der Befehl nicht funktioniert hat. Wenns über den Explorer geht, liegt die Vermutung nahe dass irgendwas das Löschen verhindert, dann würde ich mir das ganze in eine Schleife bauen

Code:
$folder = 'C:\Users\Schüler'
while (Test-Path $folder){
Remove-item $folder -recurse -force
}

Achtung, das ganze ist eine Endlosschleife und wird bei richtigen Problemen wie z.B. mangelnden Rechten zu einer Endlosschleife.

.. aber wie gesagt, ohne genaue Anforderung schwierig zu beurteilen
ok das sind die Fehler die ich bei deiner Schleife bekomme..
Profil ist nicht eingeloggt eingeloggt ist mit anderen admin profil, dürfte also nicht das problem sein
 

Anhänge

  • IMG_5480.jpg
    IMG_5480.jpg
    2,1 MB · Aufrufe: 163
Zurück
Oben