none
IF RRS feed

  • Frage

  • moin,

    wenn ich mir mit

        $Access=get-acl$Verzeichnis.FullName

    die Rechte ansehen möchte erhalte ich ein Array von Daten

    C:\temp\Neuer Ordner (5)
    FileSystemRights  : Modify, Synchronize
    AccessControlType : Allow
    IdentityReference : Jeder
    IsInherited       : True
    InheritanceFlags  : ContainerInherit, ObjectInherit
    PropagationFlags  : None

    FileSystemRights  : FullControl
    AccessControlType : Allow
    IdentityReference : VORDEFINIERT\Administratoren
    IsInherited       : True
    InheritanceFlags  : ContainerInherit, ObjectInherit
    PropagationFlags  : None

    wie kann ich das jetzt so einschränken (siehe IF) das ich nur bestimmte IdentityReference erhalte?

    sehe den Fehler nicht

    $Verzeichnisse = Get-ChildItem c:\temp -Directory
    foreach($Verzeichnis in $Verzeichnisse) 
    {
        $Access = get-acl $Verzeichnis.FullName
        foreach($x in $Access)
        {
            write-host  $Verzeichnis.FullName -ForegroundColor Green
           #$x.Access
            if($x.access.IdentityReference -like "*Administratoren")
            {
            $x.Access
            }
        }
    }

    liefert? mit -eq das selbe Problem

    Jeder                                
    VORDEFINIERT\Administratoren         
    NT-AUTORITÄT\SYSTEM                  
    VORDEFINIERT\Benutzer                
    NT-AUTORITÄT\Authentifizierte Benutzer
    NT-AUTORITÄT\Authentifizierte Benutzer
    Jeder                                
    VORDEFINIERT\Administratoren         
    NT-AUTORITÄT\SYSTEM                  
    VORDEFINIERT\Benutzer                
    NT-AUTORITÄT\Authentifizierte Benutzer
    NT-AUTORITÄT\Authentifizierte Benutzer

    .....


    Chris


    • Bearbeitet -- Chris -- Donnerstag, 22. Juni 2017 07:14
    Donnerstag, 22. Juni 2017 07:13

Antworten

  • Ich kann mir zwar nicht vorstellen, was Du damit anfangen willst, aber versuch mal so:
    $Verzeichnisse = Get-ChildItem c:\temp -Directory
    foreach($Verzeichnis in $Verzeichnisse) 
    {
        $Access = get-acl $Verzeichnis.FullName
        foreach($x in $Access)
        {
            write-host  $Verzeichnis.FullName -ForegroundColor Green
            Foreach($Reference in $x.access.IdentityReference){
                if($Reference -like "*Administratoren")
                {
                    $Reference
                }
            }
        }
    }
    


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert -- Chris -- Donnerstag, 22. Juni 2017 10:59
    Donnerstag, 22. Juni 2017 08:43
  • Hallo,

    zu "PowerShell das unbekannte Wesen".

    Das Verhalten ist absolut logisch. $x.Access.Reference ist ein Array. Deshalb musst du auch entsprechend damit umgehen. 

    Wenn du einen Vergleichsoperator auf ein Array anwendest, werden alle Werte zurückgegeben, die die Bedingung erfüllen:

    1,2,3,4 -ge 3

    Machst du das als Bedingung für einen If-Block, wird der Ausdruck als $true interpretiert, wenn mindestens ein Wert zurückgegeben wird.

    if(1,2,3,4 -ge 3){Write-Host "Richtig"}

    Für deinen Code

     if($x.access.IdentityReference -like "*Administratoren")
     {
        $x.Access
     }
    heißt das, sobald es in dem Array eine Admin-Referenz gibt, wird das gesamte Array ausgeben, weil dann die Bedingung erfüllt ist und dein Code für diesen Fall die Ausgabe des gesamten Arrays vorsieht.

    Wenn du filtern willst, wolltest du wie Chris schreibt, Where-Object benutzen.

    Viele Grüße

    Christoph

     

    • Bearbeitet hpotsirhc Donnerstag, 22. Juni 2017 10:03
    • Als Antwort markiert -- Chris -- Donnerstag, 22. Juni 2017 10:59
    Donnerstag, 22. Juni 2017 10:01
  • Hallo Chris,

    so z.B:

    (Get-Acl $Verzeichnis.Fullname).Access | Where-Object {$_.IdentityReference -like '*Admin*'}

    Beste Guresse
    brima

    • Als Antwort markiert -- Chris -- Donnerstag, 22. Juni 2017 10:59
    Donnerstag, 22. Juni 2017 10:55

Alle Antworten

  • Ich kann mir zwar nicht vorstellen, was Du damit anfangen willst, aber versuch mal so:
    $Verzeichnisse = Get-ChildItem c:\temp -Directory
    foreach($Verzeichnis in $Verzeichnisse) 
    {
        $Access = get-acl $Verzeichnis.FullName
        foreach($x in $Access)
        {
            write-host  $Verzeichnis.FullName -ForegroundColor Green
            Foreach($Reference in $x.access.IdentityReference){
                if($Reference -like "*Administratoren")
                {
                    $Reference
                }
            }
        }
    }
    


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert -- Chris -- Donnerstag, 22. Juni 2017 10:59
    Donnerstag, 22. Juni 2017 08:43
  • so geht's Olaf, Danke

    ganz schön verwirrend. Komisch dass man nicht gleich auf das Feld/Properties verweisen bzw. diese abfragen kann? In der Ausgabe kommt ja ein korrekter Wert zurück

    PS H:\> $x.access.IdentityReference -like "*Administratoren"

    VORDEFINIERT\Administratoren

    Powershell das unbekannt Wesen!

    thxs.

    PS: der Hintergrund der Aktion, ich muss 1000 Profilverzeichnis auf "*USER*" überprüfen. Administrator ist nur ein Muster auf C:


    Chris

    Donnerstag, 22. Juni 2017 08:53
  • muss müsste es eigentlich schon vorher filter können

    $Access=get-acl$Verzeichnis.FullName |where$_.Access -like"*Admin*"

    $Verzeichnisse = Get-ChildItem c:\temp -Directory
    foreach($Verzeichnis in $Verzeichnisse) 
    {
        $Access = get-acl $Verzeichnis.FullName | where $_.Access -like "*Admin*"
        $access
     #   foreach($x in $Access)
     #   {
     #       write-host  $Verzeichnis.FullName -ForegroundColor Green
     #       #$x.Access
     #       
     #       foreach($Reference in $x.Access.IdentityReference){
     #       if($Reference -eq "VORDEFINIERT\Administratoren")
     #       {
     #           $Reference
     #       }
     #       }
     #   }
    }


    Chris

    Donnerstag, 22. Juni 2017 09:05
  • Hallo,

    zu "PowerShell das unbekannte Wesen".

    Das Verhalten ist absolut logisch. $x.Access.Reference ist ein Array. Deshalb musst du auch entsprechend damit umgehen. 

    Wenn du einen Vergleichsoperator auf ein Array anwendest, werden alle Werte zurückgegeben, die die Bedingung erfüllen:

    1,2,3,4 -ge 3

    Machst du das als Bedingung für einen If-Block, wird der Ausdruck als $true interpretiert, wenn mindestens ein Wert zurückgegeben wird.

    if(1,2,3,4 -ge 3){Write-Host "Richtig"}

    Für deinen Code

     if($x.access.IdentityReference -like "*Administratoren")
     {
        $x.Access
     }
    heißt das, sobald es in dem Array eine Admin-Referenz gibt, wird das gesamte Array ausgeben, weil dann die Bedingung erfüllt ist und dein Code für diesen Fall die Ausgabe des gesamten Arrays vorsieht.

    Wenn du filtern willst, wolltest du wie Chris schreibt, Where-Object benutzen.

    Viele Grüße

    Christoph

     

    • Bearbeitet hpotsirhc Donnerstag, 22. Juni 2017 10:03
    • Als Antwort markiert -- Chris -- Donnerstag, 22. Juni 2017 10:59
    Donnerstag, 22. Juni 2017 10:01
  • Christop, danke

    wie müsste das Where aussehen?

    das geht zb. nicht

    $Access = get-acl $Verzeichnis.FullName | where Access -like "*Admin*"

    obwohl das Array im Object dabei ist.

    PS H:\>     get-acl $Verzeichnis.FullName | fl


    Path   : Microsoft.PowerShell.Core\FileSystem::C:\temp\Neuer Ordner (5)
    Owner  : firma\xyz
    Group  : firma\Domain Users
    Access : Jeder Allow  Modify, Synchronize
             VORDEFINIERT\Administratoren Allow  FullControl
             NT-AUTORITÄT\SYSTEM Allow  FullControl
             VORDEFINIERT\Benutzer Allow  ReadAndExecute, Synchronize
             NT-AUTORITÄT\Authentifizierte Benutzer Allow  Modify, Synchronize


    Chris

    Donnerstag, 22. Juni 2017 10:10
  • Hallo Chris,

    so z.B:

    (Get-Acl $Verzeichnis.Fullname).Access | Where-Object {$_.IdentityReference -like '*Admin*'}

    Beste Guresse
    brima

    • Als Antwort markiert -- Chris -- Donnerstag, 22. Juni 2017 10:59
    Donnerstag, 22. Juni 2017 10:55