ACL "fuzzy" 比较

ACL "fuzzy" comparision

我正在尝试将文件夹上的 ACL 与一组参考 ACL 进行比较,然后列出所有例外情况。等式的 "fuzzy" 部分是我希望能够忽略任何未知的 SID。因此,使用我要测试的权限创建参考文件夹将无法在它和我的测试文件夹之间使用 Compare-Object。

基本情况是我正在清理实际用户帐户已被删除的旧用户目录(这是未解析的 SID 出现的地方)。默认情况下,文件夹包括管理员权限等,我不关心这些。然而,有一些文件夹,另一个用户已被授予明确的权限,我想捕获这些文件夹。不幸的是,没有任何快捷方式可以用来检查:例如-IsInherited 或类似排除我不关心的 ACL。

根据下面的内容,我可以将 ACL 转储到一个数组中

$acl = get-acl f:\user_folder
$access = $acl.Access | ForEach-Object { $_.identityReference.value }

$access
BUILTIN\Administrators
MYDOMAIN\JBLOGGS
S-1-5-21-4444444444-9999999-1111111111-74390
MYDOMAIN\Domain_Group   ###Yes, the group has an underscore in the name

我可以创建另一个我想忽略的用户数组,包括匹配任何未解析 SID 的部分字符串。

 $defaults = @("BUILTIN\Administrators","MYDOMAIN\DomainGroup","S-1-5-21")

那么如何将我的 $defaults 数组与 $access 数组进行比较并仅输出 "MYDOMAIN\JBLOGGS" 之类的异常?

我正在尝试使用 foreach,但我对获取该异常感到困惑。下面还是输出我想避开的SID。我希望也能避免太多嵌套 "IFs".

$access | ForEach { If ($defaults -notcontains $_) { Write-Output $_ } }
MYDOMAIN\JBLOGGS
S-1-5-21-4444444444-9999999-1111111111-74390  #Do not want!

如果我将通配符 $_* 放入 -notcontains,我将再次获得 $access 的全部内容。

给你想要忽略的用户一些虚拟文件夹的权限,获取该文件夹的 acl,然后与你的实际文件夹的 acl 进行比较

$genericACL = get-acl c:\temp\dummy
$folderacl = get-acl f:\user_folder
$exceptions= $folderacl.Access.identityreference.value |?{ ($_ -notin $genericACL.access.identityreference.value) -and ($_.strartswith('S-1-5-21') -eq $false))  }  

我会这样做:

$defaults = 'BUILTIN\Administrators', 'MYDOMAIN\DomainGroup', 'S-1-5-21*'

$acl.Access | Where-Object {
    $id = $_.IdentityReference
    -not ($defaults | Where-Object { $_ -like $id })
} | Select-Object -Expand value

$defaults | Where-Object { $_ -like $id } 对给定的身份与 $defaults 的所有项目进行通配符匹配。 S-1-5-21* 末尾的通配符 * 允许匹配所有以 S-1-5-21 开头的字符串。否定 -not 反转结果,以便只有在 $defaults 中没有匹配的身份才能通过过滤器。

最后还是比较简单的,感谢楼上的帮助

我设法在原始问题中忽略了我要求它在 Powershell v2 中工作的事实。

$defaults = @("BUILTIN\Administrators","MYDOMAIN\DomainGroup")
$acl = get-acl $folder
    $access = $acl.Access | ForEach-Object { $_.identityReference.value }
    # check that no other account still has access to the folder
    $access | ForEach { 
        If ($defaultACL -notcontains $_ -and $_ -notlike 'S-1-5-21*') { 
            write-output "Extra perms:$user $_"
}