Подтвердить что ты не робот

Значения наследования и распространения с помощью set-acl и powershell

Я пытаюсь подражать действию щелчка правой кнопкой мыши по папке, установке "изменить" в папке и иметь разрешения для конкретной папки и подпапок и файлов.

В основном я использую Powershell, но наследование только устанавливается как "вложенные папки и файлы" вместо целой "этой папки, подпапок и файлов".

Есть ли какой-то нелистинговый флаг для System.Security.AccessControl.PropagationFlags, который будет правильно установлен?

Вот что я работаю до сих пор.

$Folders = Get-childItem c:\TEMP\
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
$objType = [System.Security.AccessControl.AccessControlType]::Allow 

foreach ($TempFolder in $Folders)
{
echo "Loop Iteration"
$Folder = $TempFolder.FullName

$acl = Get-Acl $Folder
$permission = "domain\user","Modify", $InheritanceFlag, $PropagationFlag, $objType
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

$acl.SetAccessRule($accessRule)
Set-Acl $Folder $acl
} 
4b9b3361

Ответ 1

Я думаю, что ваш ответ можно найти на этой странице. На странице:

Эта папка, подпапки и файлы:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None

Ответ 2

Вот таблица, которая поможет найти необходимые флаги для разных комбинаций разрешений.

    ╔═════════════╦═════════════╦═══════════════════════════════╦════════════════════════╦══════════════════╦═══════════════════════╦═════════════╦═════════════╗
    ║             ║ folder only ║ folder, sub-folders and files ║ folder and sub-folders ║ folder and files ║ sub-folders and files ║ sub-folders ║    files    ║
    ╠═════════════╬═════════════╬═══════════════════════════════╬════════════════════════╬══════════════════╬═══════════════════════╬═════════════╬═════════════╣
    ║ Propagation ║ none        ║ none                          ║ none                   ║ none             ║ InheritOnly           ║ InheritOnly ║ InheritOnly ║
    ║ Inheritance ║ none        ║ Container|Object              ║ Container              ║ Object           ║ Container|Object      ║ Container   ║ Object      ║
    ╚═════════════╩═════════════╩═══════════════════════════════╩════════════════════════╩══════════════════╩═══════════════════════╩═════════════╩═════════════╝

Итак, как сказал Дэвид, вы захотите   

    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
    PropagationFlags.None
    

Ответ 3

Просто потому, что вы в PowerShell не забыли о хороших версиях. Иногда они могут обеспечить самое легкое решение, например:

icacls.exe $folder /grant 'domain\user:(OI)(CI)(M)'

Ответ 4

Вот несколько краткий код Powershell для применения новых разрешений к папке путем изменения существующего ACL (списка контроля доступа).

# Get the ACL for an existing folder
$existingAcl = Get-Acl -Path 'C:\DemoFolder'

# Set the permissions that you want to apply to the folder
$permissions = $env:username, 'Read,Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow'

# Create a new FileSystemAccessRule object
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permissions

# Modify the existing ACL to include the new rule
$existingAcl.SetAccessRule($rule)

# Apply the modified access rule to the folder
$existingAcl | Set-Acl -Path 'C:\DemoFolder'

Каждое из значений в списке переменных $permissions относится к параметрам этот конструктор для FileSystemAccessRule.

Предоставлено эта страница.

Ответ 5

Здесь страница MSDN, описывающая флаги, и что является результатом их различных комбинаций.

Flag combinations => Propagation results
=========================================
No Flags => Target folder.
ObjectInherit => Target folder, child object (file), grandchild object (file).
ObjectInherit and NoPropagateInherit => Target folder, child object (file).
ObjectInherit and InheritOnly => Child object (file), grandchild object (file).
ObjectInherit, InheritOnly, and NoPropagateInherit => Child object (file).
ContainerInherit => Target folder, child folder, grandchild folder.
ContainerInherit, and NoPropagateInherit => Target folder, child folder.
ContainerInherit, and InheritOnly => Child folder, grandchild folder.
ContainerInherit, InheritOnly, and NoPropagateInherit => Child folder.
ContainerInherit, and ObjectInherit => Target folder, child folder, child object (file), grandchild folder, grandchild object (file).
ContainerInherit, ObjectInherit, and NoPropagateInherit => Target folder, child folder, child object (file).
ContainerInherit, ObjectInherit, and InheritOnly => Child folder, child object (file), grandchild folder, grandchild object (file).
ContainerInherit, ObjectInherit, NoPropagateInherit, InheritOnly => Child folder, child object (file).

Чтобы он применил разрешения к каталогу, а также все дочерние каталоги и файлы рекурсивно, вы захотите использовать эти флаги:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None

Таким образом, для вашего примера необходимо выполнить определенное изменение кода:

$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None