none
Prüfen ob "IdentityReference" von get-acl eine Gruppe oder ein User ist RRS feed

  • 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?

    Montag, 13. Februar 2012 16:42

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
    Dienstag, 14. Februar 2012 08:14

Alle Antworten