ACL“模糊”比较

时间:2015-05-18 08:32:54

标签: arrays powershell comparison powershell-v2.0

我正在尝试将文件夹上的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的全部内容。

3 个答案:

答案 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 $_"
}