2017-04-26 5 views
1

Voici mon script:sortie opérateur de comparaison multiples mauvais résultats Powershell

#set the root search path 
$rootPath = "c:\test\path\" 

#get a list of all directories and subdirectories in the root path 
$shares = Get-ChildItem -Path $rootPath -Directory 

#create empty array to store custom properties later 
$obj = @() 

#for every folder you find..... 
foreach ($share in $shares) { 

    #finds all security principals for each share on fileserver that has permissions explicitly assigned 
    $notInherited = Get-Acl -Path $share.FullName | select -ExpandProperty Access | Where-Object {$_.IsInherited -eq $false} 

    #for every security principal that has explicit permissions assigned.... 
    foreach ($member in $notInherited) { 

     #extract the identity of the resource from the IdentityReference field and convert it to a string object 
     [string]$identity = $member.IdentityReference 

     #test to see if the extracted resource contains a \ anywhere in the name to ensure we're looking for domain objects 
     if ($identity -like '*\*') { 

     #retrieve the SAM of the resource by splitting the string object at the \ and returning the 1 field 
     $samAccountName = $identity.Split('\')[1] 

      #filter out all domain related groups like domain admins, domain users, domain controllers, domain computers 
      if ($samAccountName -notlike 'Domain*' -or $samAccountName -notlike 'Administrators') { 

       #return AD object info for the resource using it's SAM 
       $ADObject = Get-ADObject -Filter ('SamAccountName -eq "{0}"' -f $SamAccountName) 

       #test to ensure we're only retrieving groups and not users who are explicitly assigned 
       if ($ADObject.ObjectClass -eq 'group') { 

        #create a PS object and append it's properties to the empty array created earlier 
        #assign custom fields to the object (FolderName maps to the share name and GroupName maps to name of group that has access to the share) 
        $obj += [pscustomobject] @{ 
        'GroupName' = $ADObject.Name 
        'FolderName' = $share.Name 
        } 
       } 
      } 
     } 
    } 
} 

#output the contents of the object to the console 
Write-Output $obj | ft -AutoSize | out-file C:\Scripts\test02.txt 

Je me demande pourquoi cette ligne produit des résultats erronés:

if ($samAccountName -notlike 'Domain*' -or $samAccountName -notlike 'Administrators') 

Je me attends à la sortie de ne pas inclure tous les dossiers où les 'Administrateurs' ou tout groupe commençant par 'Domaine' sont explicitement ajoutés. Si je retire la 2ème moitié pour tester afin qu'elle vérifie seulement 'Domain *', la sortie est correcte. J'ai aussi besoin de filtrer le groupe Administrateurs. Qu'est-ce que je rate?

+5

try -et au lieu de -ou 'if ($ samAccountName -notlike 'Domain *' -et $ samAccountName -n'aime pas 'Administrateurs') –

+0

lol échoue de ma part. J'aurais juré que je l'ai fait - et la première fois et ça n'a pas fonctionné ... de toute façon, ça a résolu mon problème. Merci.! –

Répondre

1

Votre demande:

if ($samAccountName -notlike 'Domain*' -or $samAccountName notlike 'Administrators') 

signifie littéralement "Pas comme X" ou "Pas comme Y"

Ce que je pense que vous cherchez est:

if (!($samAccountName -like 'Domain*' -or $samAccountName -like 'Administrators')) 

{réduction de valeur host "Yes"}

De cette façon, si $ samAccountName est comme 'Domain *' - ou $ samAccountName `` -like ' rs ', il retourne TRUE, puis le! convertit cela en faux. Par conséquent, si l'une des conditions est remplie, le résultat est faux et le bloc de code n'est PAS exécuté. donc, si un utilisateur est un domaine * ou que l'utilisateur est administrateur, il ne produira PAS "Oui" ..