Benutzer mit den meisten Antworten
Prüfen ob "IdentityReference" von get-acl eine Gruppe oder ein User ist

Frage
-
Ich schreibe an einem Script, was die ACL von Pfaden ausliest und darüber einen Report erstellt. Anschliessend möchte ich dann noch die User der gefunden Gruppen, z.B. mit get-adgroupmember, in einem weitere Report erfassen. Von get-acl bekomme ich unter anderem über die Property "IdentityReference" welche User und Gruppen Rechte erhalten haben. In etwa so:
PS C:\temp> get-acl * | select-object Path -expandproperty access | select Path,IdentityReference,AccessControlType,FileSystemRights
Path IdentityReference AccessControlType FileSystemRights
---- ----------------- ----------------- ----------------
Microsoft.PowerShell.Core\... BUILTIN\Administrators Allow FullControl
Microsoft.PowerShell.Core\... BUILTIN\Administrators Allow 268435456
Microsoft.PowerShell.Core\... NT AUTHORITY\SYSTEM Allow FullControl
Microsoft.PowerShell.Core\... NT AUTHORITY\SYSTEM Allow 268435456
Microsoft.PowerShell.Core\... BUILTIN\Users Allow ReadAndExecute, Synchronize
Da ich nun User und Gruppen beim Reporting unterschiedlich behandeln möchte suche ich eine einfache Möglichkeit festzustellen, ob es sich beim Inhalt von IdentityReference um einen User oder eine Gruppe handelt. Oder bleibt mir hier nur z.B. mittels get-adgroup eine query zu machen und wenn diese einen Fehler wirft es dann mit get-aduser zu probieren?
Antworten
-
Da IdentityReference einen Windows NT Account als String ausspuckt, kannst du diesen mit dem WinNt:// Provider in ein Objekt wandeln.
Der WinNt:// Provider ist sehr empfindlich! Accounts wie NT-AUTORITÄT/SYSTEM oder VORDEFINIERT/Administratoren müssen ausgefiltert werden!
Du musst auch daran denken das Get-ACL nicht immer den NT Account ermitteln kann, wenn eine SID nicht aufgelöst werden kann (Account im AD gelöscht = Verwaiste SID oder Domäne nicht erreichbar) Die Security benutzt intern IMMER SID!YOUR_DOMAIN_UPPERCASE durch deine Domäne in Großbuchstaben ersetzen!
get-acl * | select-object Path -expandproperty access | ForEach { # IdentityReference auslesen und den backslash gegen einen frontslash tauschen $IdentityRef = ([string]$_.IdentityReference).replace('\','/') $IdentityRef # sicherstellen das der Account in mit der Domäne (oder dem Computernamen als Domäne) beginnt. # nur dann kann er von WinNT aufgelöst werden! if ($IdentityRef.ToUpper().contains("YOUR_DOMAIN_UPPERCASE/")) { # Anzeigen ob User oder Group ([ADSI]"WinNT://$IdentityRef").psbase.SchemaClassName } }
Oder du gehst den harten weg und nutzt die Win32Security.dll mit C# und P\invoke aufrufen
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace
- Als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Februar 2012 11:06
- Bearbeitet Peter Kriegel Freitag, 17. Februar 2012 11:29
- Als Antwort markiert Alex Pitulice Montag, 20. Februar 2012 09:13
Alle Antworten
-
Da IdentityReference einen Windows NT Account als String ausspuckt, kannst du diesen mit dem WinNt:// Provider in ein Objekt wandeln.
Der WinNt:// Provider ist sehr empfindlich! Accounts wie NT-AUTORITÄT/SYSTEM oder VORDEFINIERT/Administratoren müssen ausgefiltert werden!
Du musst auch daran denken das Get-ACL nicht immer den NT Account ermitteln kann, wenn eine SID nicht aufgelöst werden kann (Account im AD gelöscht = Verwaiste SID oder Domäne nicht erreichbar) Die Security benutzt intern IMMER SID!YOUR_DOMAIN_UPPERCASE durch deine Domäne in Großbuchstaben ersetzen!
get-acl * | select-object Path -expandproperty access | ForEach { # IdentityReference auslesen und den backslash gegen einen frontslash tauschen $IdentityRef = ([string]$_.IdentityReference).replace('\','/') $IdentityRef # sicherstellen das der Account in mit der Domäne (oder dem Computernamen als Domäne) beginnt. # nur dann kann er von WinNT aufgelöst werden! if ($IdentityRef.ToUpper().contains("YOUR_DOMAIN_UPPERCASE/")) { # Anzeigen ob User oder Group ([ADSI]"WinNT://$IdentityRef").psbase.SchemaClassName } }
Oder du gehst den harten weg und nutzt die Win32Security.dll mit C# und P\invoke aufrufen
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace
- Als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Februar 2012 11:06
- Bearbeitet Peter Kriegel Freitag, 17. Februar 2012 11:29
- Als Antwort markiert Alex Pitulice Montag, 20. Februar 2012 09:13
-
Hallo qwerty3654,
Hat Dir die Antwort von Peter geholfen? Wenn ja - bitte markiere den hilfreichen Beitrag(oder die Beiträge) "als Antwort".
Danke und Grüß,
Alex
Alex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo qwerty3654,
Wir gehen davon aus, dass die Antwort Dir weitergeholfen hat.
Wenn ja, wäre es hilfreich wenn Du diese Lösung bestätigen würdest, sodass andere Leute von derselben Situation profitieren können.
Wenn nein, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.Danke und viele Grüße,
AlexAlex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.