2015-12-22 8 views
1

Это простой вопрос, но я не мог найти ответ на Google или здесь еще:PowerShell против ReadAndExecute

С помощью PowerShell или ЦМД (не вещи третьей стороной), как я могу извлекать разрешения папки таким образом, чтобы я мог различать «Содержание папки списка» и «ReadAndExecute»?

Прямо сейчас, когда я запускаю Get-Acl в папке, он возвращает тот же уровень разрешений, когда группа предоставляет только доступ к списку или чтение и выполнение. Если я щелкнул правой кнопкой и перейдите на вкладку «Безопасность», в одной группе будет указано «Содержимое папки списка», а в другой будет «Прочитать & Выполнение», но оба возвращают «ReadAndExecute» с Get-Acl.

картинки ниже:

group 1

group 2

Powershell просто возвращает "ReadAndExecute" для обоих:

FileSystemRights: ReadAndExecute, Синхронизировать

AccessControlType: Разрешить

IdentityReference: group1

IsInherited: Ложные

InheritanceFlags: ContainerInherit, ObjectInherit

PropagationFlags: Нет


FileSystemRights: ReadAndExecute, Синхронизировать

AccessControlType: Разрешить

IdentityReference: group2

IsInherited: Ложные

InheritanceFlags: ContainerInherit

PropagationFlags: Нет

+0

До сих пор не нашли решение этой – YuriW

ответ

0

Я был в состоянии найти жизнеспособное решение этой проблемы самостоятельно через некоторое время.

Несмотря на то, что PowerShell (или CMD или C#) всегда возвращает «ReadAndExecute» для как ListDirectory, так и фактических разрешений ReadAndExecute, «InheritanceFlag» всегда будет «ContainerInherit», только когда разрешение «ListDirectory». Таким образом, проверяя этот флаг, вы можете узнать, какая группа предоставляет только разрешения списка вместо чтения и выполнения.

Я выполнил эту проверку в PowerShell, которая работает для всех тестовых случаев до сих пор:

foreach($access in (Get-Acl 'C:\test').Access) { 
    $filerights = $access.FileSystemRights.ToString(); 
    $inheritanceFlg = $access.InheritanceFlags.ToString(); 
    if($inheritanceFlg -eq 'ContainerInherit') { 
     $filerights = $filerights.replace('ReadAndExecute','ListDirectory'); 
    } 
    $output = $access.IdentityReference.ToString() + ';' + $filerights; 
    $output 
} 
0
(get-Acl 'C:\Temp').Access 

возвращает коллекцию System.Security.AccessControl.FileSystemAccessRule объектов.

Имеет FileSystemRights имущество типа System.Security.AccessControl.FileSystemRights. Это перечисление, и оно может быть проверено на индивидуальные права. Например (проверка первого правила доступа ниже):

((Get-Acl 'C:\Temp').Access[0].FileSystemRights -band 
[System.Security.AccessControl.FileSystemRights]::ExecuteFile) -eq 
[System.Security.AccessControl.FileSystemRights]::ExecuteFile 

ListDirectory, ExecuteFile, чтение является то, что вы можете проверить, чтобы поймать разницу в разрешениях.

Подробнее: https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemrights(v=vs.110).aspx

+0

я использую Get-Acl. Вот что он возвращается на папку с 2 группами, одна из которых Список содержимого папки доступа только: FileSystemRights: ReadAndExecute, Синхронизировать AccessControlType: Разрешить IdentityReference: group1 IsInherited: Ложные InheritanceFlags: ContainerInherit, ObjectInherit PropagationFlags: Нет FileSystemRights: ReadAndExecute, Синхронизировать AccessControlType: Разрешить IdentityReference: gROUP2 IsInherited: Ложные InheritanceFlags: ContainerInherit PropagationFlags: Нет – YuriW

1

ваш ответ является большим, но есть только небольшая ошибка. Вы получаете неправильный параметр в переменной $ inheritanceFlags в строке 3. правильность приведенных ниже:

foreach($access in (Get-Acl 'C:\Test').Access) { 
    $filerights = $access.FileSystemRights.ToString(); 
    $inheritanceFlg = $access.InheritanceFlags.ToString(); 
    if($inheritanceFlg -eq 'ContainerInherit') { 
     $filerights = $filerights.replace('ReadAndExecute','ListDirectory'); 
    } 
    $output = $access.IdentityReference.ToString() + ';' + $filerights; 
    $output 
} 
+0

Это была опечатка, я только заметил позже, и забыл исправить здесь, спасибо – YuriW