我有一个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”只是二进制“和”的非匹配结果。绿色值是来自ACE的Windows权限,这些权限具有指定Windows权限(假设)的匹配访问掩码。
我希望我不会在这个问题上重复任何事情;我已经挖掘过,并没有找到一个答案,以我目前的理解水平向我解释这一点。
答案 0 :(得分:0)
我必须相信PetSerAl给出了导致这个答案的评论。由于已经两天了,他没有在回答表中提供他的评论,我会自己回答。
我看到的奇怪结果实际上是"碰撞"所以说二进制" 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"进行AND运算导致" ReadAndExecute,Modify" - 这是一次碰撞。而" ReadAndExecute,Modify"权限是有效的,检查实际上是要查看二进制AND是否会导致" FullControl"。第二项检查是验证结果实际上是" FullControl"而不只是任何其他有效的权限类型。没有" -band"无法进行比较。操作导致在-eq $_
Where-Object { ($Enumeration -band $_) -eq $_ }