奇怪的 PowerShell Get-ACL 权限翻译

Odd PowerShell Get-ACL permission translations

我有一个 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
    }

也许我不完全理解如何适当地翻译这些访问控制条目。 "Modify, Synchronize" 会以某种方式出现在 "FullControl".

的权限设置中,这对我来说似乎很奇怪

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

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

我必须感谢 PetSerAl 给我的评论,才得出了这个答案。因为已经两天了,他还没有在回答表中提供他的评论,我会自己回答。

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

初始值(权限)无法直接与正在检查的权限类型进行比较,因为对象显然不兼容。通过 运行 对权限值和正在测试的值进行二进制 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 $_