2 votes

PowerShell : trouver quels groupes sont attachés à quels dossiers

(C'est mon premier message, alors désolé si je suis difficile à comprendre ou si je pose une mauvaise question)

Voici mon problème :

J'ai quelques groupes AD avec une convention d'appellation similaire. "*somename" et j'ai utilisé la commande Get-ADGroup pour obtenir un tableau rempli de ces objets.

De même, j'ai des dossiers avec des permissions NTFS sur eux que j'ai dans un autre tableau. Ces autorisations sont un mélange des groupes que j'ai mentionnés plus tôt, ainsi que d'autres groupes et utilisateurs individuels selon les besoins.

Objectif final (ce que j'aimerais trouver) :

  • Quels dossiers n'ont aucun de ces groupes AD assignés.
  • Et lesquels de ces groupes AD ne sont attachés à aucun dossier.
  • Quels dossiers sont affectés à quel groupe AD de cette liste.

Voici ce que j'ai essayé

$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}}
        }
    }
}

Les enjeux :

Je n'arrive pas à faire correspondre les correspondances à la fin du foreach.

  • Pour ce qui est de la correspondance à la fin du foreach, je n'arrive pas à obtenir une évaluation correcte lorsqu'ils correspondent. En partie parce que l'un d'entre eux a le domaine attaché à l'avant et l'autre non (d'où la partie "domain").
  • Je n'arrive pas à faire en sorte qu'il sélectionne le chemin du répertoire lorsqu'il est dans une boucle foreach,

4voto

Clayton Points 4443

Il est difficile de voir les erreurs que vous obtenez sans un environnement similaire pour l'exécuter. Je peux faire les deux suggestions suivantes.

1) Get-Childitem ne renvoie aucun élément avec une propriété "path". Essayez d'utiliser la propriété "Fullname" à la place.

2) Lorsque vous tentez de faire correspondre une chaîne de caractères contenant des caractères qui exécutent des fonctions spéciales de regex (comme \$^ ?.), vous devez les échapper pour qu'ils puissent être mis en correspondance. La barre oblique inverse est le principal caractère d'échappement dans les expressions régulières.

$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

Essayez ce qui suit sur le côté droit de votre -match

-match ( [regex]::Escape("Domain\" + $group.name))

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X