PowerShell: localizando quais grupos estão anexados a quais pastas

3

(Este é meu primeiro post, desculpe se eu for difícil de entender ou fazer uma pergunta ruim)

Aqui está o meu problema:

Eu tenho alguns grupos do AD com uma convenção de nomenclatura semelhante. "* somename" e usei o comando Get-ADGroup para obter uma matriz preenchida com esses objetos.

Da mesma forma, tenho pastas com permissões NTFS neles que tenho em outro array. Essas permissões são uma mistura dos grupos que mencionei anteriormente, além de outros grupos e usuários individuais, conforme necessário.

Fim do objetivo (o que eu gostaria de encontrar):

  • Quais pastas não têm nenhum desses grupos do AD atribuídos.
  • E quais desses Grupos do AD não estão anexados a nenhuma pasta.
  • Quais pastas têm o Grupo do AD da lista atribuída a ele.

Veja o que tentei

$CS_Dirs=get-childitem '\my.server\share$\Dept' -recurse -depth 1 -filter copierscans
$CS_Roles=Get-ADGroup -filter {Name -like "* CopierScans"}

####For each directory in $CS_Dirs array, get acl###
foreach($dir in $CS_Dirs){

    ###Get the ACL for the Dir###
    get-acl $dir.PSPath | %{

        ####Variable to tell this loop if next loops find a match###
        $contains=$false

        ####For every access object in that ACL###
        foreach ($access in $_.access){

            ###loop through each group to check if any of the dir's ACL's principals are in my list of AD Groups.
            foreach($group in $CS_ADGrups){

                #If they are then set contains to true to tell the outer loop to select that path
                if($access.identityreference.ToString() -match {"DOMAIN\"+$group.name.ToString()}){
                    $contains=$true
                }
            }
        }

        #Should be a list of all the paths
        #Which are not assigned a group contained in my $CS_ADGroups list.
        if($contains){
            $_ | select @{n="path";e={$_.path}}
        }
    }
}

Os problemas:

A correspondência no final do foreach não consigo combinar um com o outro

  • A correspondência no final do foreach, não consigo fazer com que ele seja avaliado corretamente quando eles correspondem. em parte porque um deles tem o domínio ligado à frente e o outro não (daí a porção "domínio \")
  • Não consigo selecionar o caminho do diretório quando ele está dentro de um loop foreach,
por Cody Nichols 12.05.2017 / 21:42

1 resposta

4

É difícil ver os erros que você está recebendo sem um ambiente semelhante para executá-lo. Eu posso fazer as seguintes duas sugestões.

1) Get-Childitem não retorna nenhum item com uma propriedade "path". Tente usar a propriedade "Fullname" em vez disso.

2) Quando você tenta associar uma string que contém caracteres que executam funções de regex especiais (como \ $ ^ ?.) você precisa escapar para que eles possam ser correspondidos. Barra invertida é o caractere de escape principal em expressões regulares.

$group = "DOMAIN\Some Group"
$group -match $group
False
$group -match [regex]::Escape($group)
True

[Regex]::Escape("DOMAIN\Some Group")
DOMAIN\Some\ Group
help about_regular_expressions

Experimente o seguinte no lado direito do seu -match

-match ( [regex]::Escape("Domain\" + $group.name))
    
por 12.05.2017 / 23:05