PowerShell:查找哪些组附加到哪些文件夹

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 末尾的匹配,当它们匹配时,我无法让它正确地评估真实。部分原因是其中一个在前面附加了域,而另一个没有(因此有“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))

相关内容