(这是我的第一篇文章,很抱歉,如果我很难理解或问一个坏的问题)
我有几个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结尾的匹配我无法与海誓山盟匹配
如果没有类似的环境来运行它,很难看到你得到的错误。 我可以提出以下两点build议。
1)Get-Childitem不返回任何具有“path”属性的项目。 尝试使用“全名”属性来代替。
2)当你尝试匹配一个包含执行特殊正则expression式函数的字符的string(比如\ $ ^ ?.)时,你需要将它们转义出来以便匹配。 反斜杠是正则expression式中的主要转义字符。
$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
-match ( [regex]::Escape("Domain\" + $group.name))