2016-07-25 87 views
0

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

#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”只是二进制“和”的非匹配结果。绿色值是由具有指定Windows权限的匹配访问掩码的ACE所产生的Windows权限(据推测)。

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

+0

'$ Enumeration -band $ _;' - >'($ Enumeration -band $ _)-eq $ _;' – PetSerAl

+0

@PetSerAl谢谢!我对这个还很新,通过比较二进制的结果和传入的原始类型集,我能获得什么?欣赏帮助 – Shrout1

+0

@PetSerAl好吧,我明白了:)我在传入的掩码和正在评估的掩码之间发生了一些奇怪的冲突。二进制和完全控制和读取和执行恰好等于读取和执行。奇怪的巧合碰撞。 – Shrout1

回答

0

我得信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 
    } 

这种比较是为了验证被检查从值的任何所得的权限和它正对着检查的类型表示的值被检查,而不是二进制值导致的碰撞完全不同的权限。

例如,当用$ Enumeration代表“ReadAndExecute,Modify”&在“ReadAndExecute,Modify”中用“FullControl”进行AND时,这是一次碰撞。虽然“ReadAndExecute,Modify”权限是有效的,但该检查实际上是查看Binary AND是否会导致“FullControl”。第二个检查是验证结果实际上是“FullControl”,而不是其他任何有效的权限类型。如果没有“带”操作,则无法进行比较导致在该行中添加-eq $_Where-Object { ($Enumeration -band $_) -eq $_ }