この回答につながったコメントを私は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 $_ }
'$ Enumeration -band $ _;' - > '($ Enumeration -band $ _)-eq $ _;'行の中に
-eq $_
が追加されます。 – PetSerAl@PetSerAlありがとう!私はまだこれにかなり新しいです。バイナリの結果と、渡された元のタイプのセットとを比較することで、私は何を得ますか?ヘルプを評価してください – Shrout1
@PetSerAl Ok私はそれを得る:)私は渡されているマスクと評価されているマスクの間にいくつかの奇妙な衝突を得ている。バイナリとフルコントロールと読み取りと実行は、読み取りと実行と同じになります。奇妙な偶然の衝突。 – Shrout1