2016-07-25 6 views
0

액세스 마스크를 사용하여 Get-ACL Access Control Entries와 표준 Windows 권한을 일치시키는 PowerShell script이 있습니다. 이상하게도, "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"은 바이너리 "and"에서 단순히 일치하지 않는 결과입니다. 녹색 값은 지정된 Windows 권한 (예상대로)에 대해 일치하는 액세스 마스크가있는 ACE의 결과 Windows 권한입니다.

나는이 질문으로 무엇이든 반복하지 않기를 바랍니다. 나는 파헤 치고 나의 현재의 이해 수준에서 이것을 나에게 설명하는 답을 찾지 못했다.

+0

'$ Enumeration -band $ _;'($ Enumeration -band $ _) -eq $ _;'줄에 -eq $_이 추가됩니다. – PetSerAl

+0

@PetSerAl 감사합니다! 나는 아직도 이것에 아주 새롭다; 바이너리의 결과와 전달 된 원래 유형 세트를 비교하면 무엇을 얻을 수 있습니까? 도움을 감사하십시오 – Shrout1

+0

@PetSerAl 좋아요. 알 겠어요. :) 전달되는 마스크와 평가되는 마스크 사이에 이상한 충돌이 일어나고 있습니다. 바이너리와 Full Control, Read와 Execute는 Read와 Execute와 동일하게 발생합니다. 이상한 우연의 충돌. – Shrout1

답변

0

나는이 대답으로 이어진 의견을 주면서 PetSerAl에 신용을 줘야합니다. 2 일이 지났고 응답 양식에 자신의 의견을 밝히지 않았기 때문에 나는 스스로 답할 것이다.

내가보고있는 이상한 결과는 실제로 "충돌"의 결과이므로 테스트 할 사용 권한과 사용 권한 유형을 확인하기위한 "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"과 AND 연산을 수행하면 "ReadAndExecute, Modify"가됩니다. 충돌입니다. "ReadAndExecute, Modify"권한이 유효한 동안 이진 AND가 "FullControl"이되는지 여부를 실제로 확인했습니다. 두 번째 검사는 다른 유효한 사용 권한 유형이 아니라 결과가 실제로 "FullControl"인지 확인하는 것입니다. 이 "대역"동작없이 비교할 수 없다면, Where-Object { ($Enumeration -band $_) -eq $_ }