【发布时间】:2015-07-29 16:15:39
【问题描述】:
我正在尝试将文件夹上的 ACL 与 ACL 参考集进行比较,然后列出所有例外情况。等式的“模糊”部分是我希望能够忽略任何未知的 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。我也希望避免太多嵌套的“IF”。
$access | ForEach { If ($defaults -notcontains $_) { Write-Output $_ } }
MYDOMAIN\JBLOGGS
S-1-5-21-4444444444-9999999-1111111111-74390 #Do not want!
如果我将通配符$_* 放入-notcontains,我会再次得到$access 的全部内容。
【问题讨论】:
标签: arrays powershell comparison powershell-2.0