【问题标题】:ACL "fuzzy" comparisionACL“模糊”比较
【发布时间】: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


    【解决方案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 中不匹配的身份才能通过过滤器。

    【讨论】:

    • 感谢三年后不接受我的回答。
    • 我实际上是想支持它而不是最初接受它作为答案,因为代码不起作用,但它是一个有用的指针。我偶然再次遇到了这个问题,并决定修复它。很抱歉忘记了投票,但您现在可以将其添加到您的 147k 代表中。
    • 该代码最初可能对您不起作用 b/c 我使用 $access 而不是 $acl.Access,在您的代码中是已经扩展的身份引用。大概我在进行测试运行时设置了$access = $acl.Access,然后复制/粘贴它。那部分现在已经修好了。并且非常清楚,我不关心几个点代表。
    【解决方案2】:

    在虚拟文件夹上为您想要忽略的用户提供一些权限,获取该文件夹的 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))  }  
    

    【讨论】:

    • Powershell 中没有“-notin”。我试图用“-notcontains”重新设计它,但我认为我必须通过一个 foreach 循环来运行它。
    • @Trix notinin 运算符在 Powershell V3 中引入
    • 谢谢,我忘了说明它需要 Powershell 2.0
    • @Trix 不,是我没注意你的标签 ;)
    【解决方案3】:

    多亏了上面的帮助,最后还是相当简单的。

    我设法省略了原始问题中要求它在 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 $_"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多