Quantcast
Channel: Windows PowerShell Forum
Viewing all articles
Browse latest Browse all 2314

User Profile löschen: Get-WmiObject vs. Get-CimInstance / Arrays / Log-Files

$
0
0

Hallo zusammen!

Vorab: ich bemühe mich seit einiger Zeit mich stückweise in PowerShell einzuarbeiten, habe auch einige Bücher zum Thema ("Learn PowerShell in a Month of Luches [D. Jones, J. Hicks]", "Windows PowerShell 4.0: Das Praxisbuch [H. Schwichtenberg]","PowerShell 5.0: Windows-Automation für Einsteiger und Profis [T. Weltner]"), komme aber leider nicht so regelmäßig und strukturiert dazu, wie man es gerne hätte...

Vor diesem Hintergrund: please don't shoot me for obvious/stupid mistakes ():-)

Nun habe ich aktuell eine Herausforderung, die ich gerne mit PowerShell automatisieren würde, bastel' nun schon einige Tage immer wieder daran herum, habe diverse Suchmaschinen befragt und etliche Artikel/Blogs/Forenbeiträge gelesen, komme im Moment aber nicht mehr weiter:

Auf Win7 Clients sollen per StartUp-Skript, unter bestimmten Kriterien, ein bis mehrere lokale Benutzerprofile gelöscht werden.

Aktuell sieht mein Skript wie folgt aus:

$Days=30

Start-Transcript -Path C:\ProfileCleanup.log -Append

Write-Warning "Filtern nach User-Profilen die laenger als $Days Tage nicht genutzt wurden"

Get-WmiObject -class Win32_UserProfile | Where {(!$_.special) -and ($_.localpath -ne "C:\users\administrator") -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-$Days))} | Remove-WmiObject -Verbose

Stop-Transcript

Prinzipiell funktioniert das auch einigermaßen - allerdings scheitert in einigen, nicht ganz seltenen, Fällen das Löschen des User-Ordners (C:\Users\Test), was dann im Log-file mit "RemoveWMICOMException" quittiert wird.

Den Effekt kenne ich vom Löschen von User-Profilen via Gui ("Verzeichnis ist nicht leer").
Manuell, per "rd /q /s c:\Users\tester" gelingt das Löschen spätestens beim zweiten Versuch.

1.
Die Idee wäre, mir mittels WMI Query die zu löschenden User in ein Array zu stecken, dann mit einer Schleife über selbiges zu iterieren, dabei mit Try/Catch erst die User-Verzeichnisse zu löschen und erst bei Erfolg, das User-Profil zu löschen.

Woran ich u.A. im Moment scheitere, ist die im WmiObjekt als „LocalPath“ vorhandene Information in eine Variable zu stecken um sie z.B. an „Remove-Item –Path „Variable“ –Recurse –Force“ übergeben zu können.

Geht das überhaupt so? Oder sollte man das besser anders aufbauen?

2.
Auf den Clients landen dabei Log-Files, die ich versucht habe über ein weiteres Skript einzusammeln

$OutputFile = "C:\Test\ProfileCleanup.log"
$ComputerListe = "C:\Test\Computerliste.txt"
$compArray = @(Get-Content -Path $ComputerListe)

for ($i=0; $i -lt $compArray.Length; $i++){
    Write-Host -ForegroundColor Cyan $compArray[$i]
    Get-Content \\ $compArray[$i] \c$\profileCleanup.log | Out-File  $OutputFile -append
    }


Allerdings gelingt es mir leider nicht, den Client-Namen in „Get-Content –Path“ zu übergeben.

Get-Content : Es wurde kein Positionsparameter gefunden, der das Argument "Test" akzeptiert.
In Zeile:8 Zeichen:5+     Get-Content -path \\ $compArray[$i] \c$\profileCleanup.log | Out-File  $Outp ...+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo          : InvalidArgument: (:) [Get-Content], ParameterBindingException+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetContentCommand

3.
Gibt es für mein Vorhaben wesentliche Vorteile, die für „Get-CimInstance“ an Stelle von „Get-WmiObject“ sprechen würden?

Vielen Dank im Voraus!

Gruß TechnikSC885



Viewing all articles
Browse latest Browse all 2314


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>