rudeboy
Goto Top

"Konto unbekannt" auf AD-Clients per Powershell löschen

Hallo zusammen,

bei der letzten Clientrechner-Wartung hatte ich diverse, veraltete bzw. unbekannte Profile.
profilübersicht
Da kam mir die Idee regelmäßig alle AD-Rechner diesbezüglich zu reinigen.
Es gibt wohl auch eine GPO-Einstellung dazu, die erscheinende Meldung wirft beim User aber wohl nur unnötig Fragen auf.
https://social.technet.microsoft.com/wiki/contents/articles/28647.how-to ...
Leider reichen meine Programmierkenntnisse nicht dafür.
Lokal funktioniert das so schon mal:
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-732))} | Remove-WmiObject
Müsste man aber eigentlich auch domänenweit über
Get-ADComputer -Filter * | Select -Expand Name
pipen können?!

Danke und Gruß
rudeboy

Content-ID: 331405

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

132272
Lösung 132272 07.03.2017 aktualisiert um 17:23:14 Uhr
Goto Top
Get-WMIObject akzeptiert den Parameter -ComputerName, und der akzeptiert auch ein Array, jetzt sollte es klick machen face-wink.

ACHTUNG mit deinem Befehl löschst du auch Profile von noch vorhandenen Usern. Besser du checkst die SID Auflösung zu einem User, wie hier:
Powershell Script zum löschen von lokalen Profilen bei "Account Unknown"
gwmi win32_Userprofile | ?{try{$result = (New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount])}catch{$_}} | remove-wmiobject
Gruß
131993
Lösung 131993 07.03.2017 aktualisiert um 21:47:53 Uhr
Goto Top
Zitat von @132272:
gwmi win32_Userprofile | ?{try{$result = (New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount])}catch{$_}} | remove-wmiobject
Funktioniert der Befehl so? Eigentlich müsste im catch teil dein $_ die Exception repräsentieren, wodurch du eine Exception an "remove-wmiobject" weiterleitest.

Müsste dann eigentlich so sein:
gwmi win32_Userprofile | ?{$obj=$_;try{$voidResult = (New-Object System.Security.Principal.SecurityIdentifier($obj.SID)).Translate([System.Security.Principal.NTAccount])}catch{$obj}} | remove-wmiobject

Außerdem ist gwmi (get-wmiobject) als deprecated markiert und erhält schon seit längerem keine funktions/performance updates wie Microsoft es nennt.
Get-CimInstance win32_Userprofile | ?{$obj=$_;try{$voidResult = (New-Object System.Security.Principal.SecurityIdentifier($obj.SID)).Translate([System.Security.Principal.NTAccount])}catch{$obj}} | Remove-CimInstance
132272
132272 07.03.2017 aktualisiert um 21:56:25 Uhr
Goto Top
Funktioniert der Befehl so?
Ja, weil hier ja tatsächlich nichts ausgeben werden soll und wird, da das in einem where-object stattfindet! Das ist nur dafür da damit dass Pipeline Object weitergeleitet wird face-wink, könnte man also auch durch ein $true ersetzen.
Außerdem ist gwmi (get-wmiobject) als deprecated markiert
gwmi nur damit er es auch mit PS 2.0 nutzen kann, wer weiß ob er das noch auf reinen W7 ohne MMF Update abfackeln will
131993
131993 07.03.2017 aktualisiert um 22:13:01 Uhr
Goto Top
@132272
Zitat von @132272:
Ja, weil hier ja tatsächlich nichts ausgeben werden soll und wird, da das in einem where-object stattfindet! Das ist nur dafür da damit dass Pipeline Object weitergeleitet wird face-wink, könnte man also auch durch ein $true ersetzen.
Danke für die Erklärung. Dachte jetzt wirklich kurz, dass "?" der alias für ein foreach-Object währe, mein Fehler.
Jetzt weiß ich auch wieder, wieso ich diese Aliase sehr selten verwende...
Außerdem ist gwmi (get-wmiobject) als deprecated markiert
gwmi nur damit er es auch mit PS 2.0 nutzen kann, wer weiß ob er das noch auf reinen W7 ohne MMF Update abfackeln will
Das gabs damals noch nicht?
Ist man nicht mehr dran gewöhnt, seitdem PowerShell mittels WSUS verteilt werden kann face-wink Und automatisch alle Clients (mit wenigen außnahmen) die Version 5 haben.
132272
132272 07.03.2017 um 22:14:05 Uhr
Goto Top
Das gabs damals noch nicht?
Nope, erst seit PS 3.0.
rudeboy
rudeboy 08.03.2017 aktualisiert um 08:12:21 Uhr
Goto Top
Zitat von @132272:

Get-WMIObject akzeptiert den Parameter -ComputerName, und der akzeptiert auch ein Array, jetzt sollte es klick machen face-wink.

ACHTUNG mit deinem Befehl löschst du auch Profile von noch vorhandenen Usern. Besser du checkst die SID Auflösung zu einem User, wie hier:
Powershell Script zum löschen von lokalen Profilen bei "Account Unknown"
> gwmi win32_Userprofile | ?{try{$result = (New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount])}catch{$_}} | remove-wmiobject
> 
Gruß
Moin!
Danke an euch für die Codebeispiele, hat an einem Testrechner funktioniert.
Gruß