【问题标题】:Odd PowerShell Get-ACL permission translations奇怪的 PowerShell Get-ACL 权限翻译
【发布时间】:2016-07-25 15:11:06
【问题描述】:

我有一个PowerShell script,它使用访问掩码将 Get-ACL 访问控制条目与标准 Windows 权限相匹配。奇怪的是,像“ReadAndExecute, Synchronize”这样的 ACE 似乎产生了“FullControl”的权限。这是脚本:

 #Match current ACE permissions to regular permissions via access mask comparison (binary and / -band)
    $acl = Get-Acl "C:\Program Files (x86)"             
    $accesses = $acl.Access
    #Enumerate current directory's access rights
    foreach ($access in $accesses) {
            $Enumeration = $access.FileSystemRights
            $keys = @()
            [System.Enum]::GetValues($Enumeration.GetType()) | Where-Object { $Enumeration -band $_; write-host ($Enumeration -band $_) -ForegroundColor Red} | % {write-host -ForegroundColor Green $_;} | Select-Object -Unique | ForEach-Object { write-host -ForegroundColor Cyan $_; $keys += $_ }             
            $keys
    }

也许我不完全理解如何正确翻译这些访问控制条目。我觉得奇怪的是,“修改,同步”会以某种方式最终出现在“FullControl”的权限设置中。

此外,如果此脚本在您自己的系统上运行,您会注意到它当前描绘的相当混乱的调试格式。 “0”只是二进制“and”的不匹配结果。绿色值是来自 ACE 的结果 Windows 权限,这些 ACE 具有与指定 Windows 权限匹配的访问掩码(假设)。

我希望我不会重复这个问题;我已经挖掘并没有找到以我目前的理解水平向我解释这一点的答案。

【问题讨论】:

  • $Enumeration -band $_; -> ($Enumeration -band $_) -eq $_;
  • @PetSerAl 谢谢!我对此还是很陌生;通过比较二进制的结果和传入的原始类型集,我可以获得什么?感谢帮助
  • @PetSerAl 好的,我明白了 :) 我在传入的掩码和正在评估的掩码之间遇到了一些奇怪的碰撞。完全控制和读取和执行的二进制和恰好等于读取和执行。奇怪的巧合碰撞。

标签: powershell file-permissions acl


【解决方案1】:

我必须感谢 PetSerAl 给了我导致这个答案的评论。由于已经两天了,他还没有在答案表中提供他的评论,我会自己回答。

我看到的奇怪结果实际上是“冲突”的结果,可以说是在旨在验证权限的二进制“AND”操作和被测试的权限类型之间。

初始值(权限)不能直接与被检查的权限类型进行比较,因为对象显然不兼容。通过对权限值和正在测试的值运行二进制 AND,然后可以检查测试值是否实际上是正在检查的权限。出于某种原因,二元与运算会产生一个可以直接测试的对象。

在完成二进制 AND 后,需要将结果与传递给二进制“AND”运算符的权限类型进行比较。这是修改后的代码:

 #Match current ACE permissions to regular permissions via access mask comparison (binary and / -band)
    $acl = Get-Acl "C:\Program Files (x86)"             
    $accesses = $acl.Access
    #Enumerate current directory's access rights
    foreach ($access in $accesses) {
            $Enumeration = $access.FileSystemRights
            $keys = @()
            [System.Enum]::GetValues($Enumeration.GetType()) | Where-Object { ($Enumeration -band $_) -eq $_; write-host ($Enumeration -band $_) -ForegroundColor Red} | % {write-host -ForegroundColor Green $_;} | Select-Object -Unique | ForEach-Object { write-host -ForegroundColor Cyan $_; $keys += $_ }                
            $keys
    }

这种比较是为了验证从被检查的值和被检查的类型产生的任何许可都代表被检查的值,而不是二进制值的冲突导致完全不同的许可。

例如,“ReadAndExecute, Modify”由 $Enumeration 表示并与“FullControl”进行与运算时会导致“ReadAndExecute, Modify” - 这是一个冲突。虽然“ReadAndExecute, Modify”权限是有效的,但检查实际上是看二进制 AND 是否会导致“FullControl”。第二个检查是验证结果实际上是“FullControl”,而不仅仅是任何其他有效的权限类型。在没有“-band”操作的情况下无法进行比较会导致在Where-Object { ($Enumeration -band $_) -eq $_ } 行中添加-eq $_

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多