2016-07-25 27 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 $_ }