2016-07-25 13 views
0

私はPowerShell scriptにアクセスマスクを使用してGet-ACLアクセス制御エントリと標準Windowsアクセス許可を一致させます。奇妙なことに、 "ReadAndExecute、Synchronize"のようなACEは "FullControl"の許可を得ているようです。奇数PowerShell Get-ACL許可変換

おそらく、これらのアクセス制御エントリを適切に翻訳する方法を完全に理解していないかもしれません。私にとって、 "修正、同期"は "FullControl"のパーミッション設定でどうにかなるでしょう。

また、このスクリプトを独自のシステムで実行すると、現在表示されているかなり厄介なデバッグフォーマットに気付くでしょう。 "0"はバイナリ "and"の結果と単純に一致しません。緑の値は、指定されたWindowsのアクセス許可(想定される)に対してアクセスマスクが一致したACEからの結果のWindowsアクセス許可です。

私はこの質問で何も繰り返さないことを願っています。私は掘り下げて、これを私の現在の理解レベルで説明する答えは見つけられませんでした。

+0

'$ Enumeration -band $ _;' - > '($ Enumeration -band $ _)-eq $ _;'行の中に-eq $_が追加されます。 – PetSerAl

+0

@PetSerAlありがとう!私はまだこれにかなり新しいです。バイナリの結果と、渡された元のタイプのセットとを比較することで、私は何を得ますか?ヘルプを評価してください – Shrout1

+0

@PetSerAl Ok私はそれを得る:)私は渡されているマスクと評価されているマスクの間にいくつかの奇妙な衝突を得ている。バイナリとフルコントロールと読み取りと実行は、読み取りと実行と同じになります。奇妙な偶然の衝突。 – Shrout1

答えて

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 
    } 

この比較はチェックされている値から任意得許可がチェックされ、それが照合されているタイプの値を表すことを確認するとしないで得​​られたバイナリ値の衝突:ここで変更されたコードであります異なる許可をすべて

たとえば、$ Enumeration &で表される "ReadAndExecute、Modify"は、 "FullControl"と論理和をとり、 "ReadAndExecute、Modify"になります。これは衝突です。 "ReadAndExecute、Modify"パーミッションが有効な間、チェックは実際にバイナリANDが "FullControl"になるかどうかを確認することでした。 2番目のチェックは、他の有効なアクセス許可の種類だけでなく、結果が実際に "FullControl"であることを確認することです。この "バンド"動作なしで比較できない場合、Where-Object { ($Enumeration -band $_) -eq $_ }

関連する問題