web-dev-qa-db-ja.com

PowerShell:どのグループがどのフォルダーにアタッチされているかを見つける

(これは私の最初の投稿なので、理解しにくい場合や悪い質問をした場合は申し訳ありません)

これが私の問題です:

同様の命名規則を持つADグループがいくつかあります。 「* somename」と私はGet-ADGroupコマンドを使用して、これらのオブジェクトで満たされた配列を取得しました。

同様に、別のアレイにあるNTFSアクセス許可のあるフォルダーがあります。これらの権限は、前述のグループと、必要に応じて他のグループおよび個々のユーザーを組み合わせたものです。

最終目標(私が見つけたいもの):

  • これらのADグループが割り当てられていないフォルダはどれですか。
  • そして、それらのADグループのどれがどのフォルダーにも接続されていません。
  • そのリストのどのADグループがどのフォルダに割り当てられているか。

これが私が試したことです

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

問題:

Foreachの最後のマッチング私はお互いにマッチングすることができません

  • Foreachの最後の一致、一致したときにtrueを正しく評価することができません。 1つはドメインが前面に接続されており、もう1つは接続されていないためです(したがって、「ドメイン」部分)
  • Foreachループ内にある場合、ディレクトリパスを選択するように取得できません。
2
Cody Nichols

それを実行するための同様の環境がなければ、発生しているエラーを確認することは困難です。私は次の2つの提案をすることができます。

1)Get-Childitemは、「path」プロパティを持つアイテムを返しません。代わりに「フルネーム」プロパティを使用してみてください。

2)特別な正規表現関数(\ $ ^?。など)を実行する文字を含む文字列を照合しようとする場合は、それらをエスケープして照合できるようにする必要があります。バックスラッシュは、正規表現の主要なエスケープ文字です。

$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

-matchの右側で次のことを試してください

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