我正在尝试将文件夹上的ACL与参考ACL集进行比较,然后列出所有异常。等式的“模糊”部分是我希望能够忽略任何未知的SID。因此,使用我想要测试的perms创建一个参考文件夹将无法在它和我的测试文件夹之间使用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
的全部内容。
答案 0 :(得分:1)
我做这样的事情:
$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
中没有匹配的标识才能通过过滤器。
答案 1 :(得分:0)
在虚拟文件夹上给你想要忽略的用户,获取该文件夹的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)) }
答案 2 :(得分:0)
最后,由于上面的帮助,它非常简单。
我设法省略了原始问题中我需要它在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 $_"
}