![PowerShell:查找哪些组附加到哪些文件夹](https://linux22.com/image/704198/PowerShell%EF%BC%9A%E6%9F%A5%E6%89%BE%E5%93%AA%E4%BA%9B%E7%BB%84%E9%99%84%E5%8A%A0%E5%88%B0%E5%93%AA%E4%BA%9B%E6%96%87%E4%BB%B6%E5%A4%B9.png)
(这是我的第一篇帖子,如果我的提问难以理解或者问得不好,请原谅)
这是我的问题:
我有几个具有类似命名约定的 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 末尾的匹配,当它们匹配时,我无法让它正确地评估真实。部分原因是其中一个在前面附加了域,而另一个没有(因此有“domain \”部分)
- 当它在 foreach 循环中时,我无法让它选择目录路径,
答案1
如果没有类似的环境来运行,很难看到您遇到的错误。我可以提出以下两个建议。
1) Get-Childitem 不返回任何具有“path”属性的项目。请尝试使用“Fullname”属性。
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))