(これは私の最初の投稿なので、理解しにくい場合や悪い質問をした場合は申し訳ありません)
同様の命名規則を持つADグループがいくつかあります。 「* somename」と私はGet-ADGroupコマンドを使用して、これらのオブジェクトで満たされた配列を取得しました。
同様に、別のアレイにあるNTFSアクセス許可のあるフォルダーがあります。これらの権限は、前述のグループと、必要に応じて他のグループおよび個々のユーザーを組み合わせたものです。
$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の最後のマッチング私はお互いにマッチングすることができません
それを実行するための同様の環境がなければ、発生しているエラーを確認することは困難です。私は次の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))