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-Key: 331405

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

Printed on: April 25, 2024 at 17:04 o'clock

Mitglied: 132272
Solution 132272 Mar 07, 2017 updated at 16:23:14 (UTC)
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ß
Mitglied: 131993
Solution 131993 Mar 07, 2017 updated at 20:47:53 (UTC)
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
Mitglied: 132272
132272 Mar 07, 2017 updated at 20:56:25 (UTC)
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
Mitglied: 131993
131993 Mar 07, 2017 updated at 21:13:01 (UTC)
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.
Mitglied: 132272
132272 Mar 07, 2017 at 21:14:05 (UTC)
Goto Top
Das gabs damals noch nicht?
Nope, erst seit PS 3.0.
Member: rudeboy
rudeboy Mar 08, 2017 updated at 07:12:21 (UTC)
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ß