Сценарий Powershell добавляет пользователей в ACL папки, но не применяет разрешения

#powershell

#powershell

Вопрос:

Я пишу скрипт для добавления пользователя в ACL папки с определенными разрешениями. Приведенный ниже код добавляет пользователя в список управления доступом, но не предоставляет разрешения на чтение. Переменная $ User_Name — это просто переменная, определяющая пользователя, у которого я хотел бы иметь права на чтение. Любая помощь в этом была бы отличной.

 $ACL = Get-ACL -Path c:test
$AccessRule = New-Object 
System.Security.AccessControl.FileSystemAccessRule($User_Name,"Read","Allow")
$ACL.SetAccessRule($AccessRule)
$ACL | Set-Acl -Path c:test
 

Ответ №1:

Трудно сказать, где это пошло не так..
Это может быть связано с дополнительными символами новой строки, которые вы вводите после New-Object ,
или с identityreference в $User_Name (это DomainUserAccountName ?),
Или, как я подозреваю, это может быть связано с тем, что вы не указываете значения для наследования и распространения в новом правиле доступа.

Попробуйте:

     $folder = 'C:test'
    # create a new access rule
    # see: https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontrol.filesystemaccessrule
    $rule = [System.Security.AccessControl.FileSystemAccessRule]::new($User_Name, "Read", "None,ObjectInherit", "None", "Allow")

    # get the current ACL of the folder
    $acl = Get-Acl -Path $folder
    # add the new rule to the ACL
    $acl.AddAccessRule($rule)
    $acl | Set-Acl $folder
 

См .: InheritanceFlags и PropagationFlags

P.S. Для администрирования лучше устанавливать права доступа к файлам для групп, а не для отдельных пользователей. Это значительно упрощает обслуживание


Примечание:

Вместо AddAccessRule() этого вы можете предпочесть SetAccessRule() .

AddAccessRule()
Этот метод добавит это правило доступа к списку управления доступом.
Если у пользователя есть разрешение на изменение, и мы используем AddAccessRule() для создания нового правила с разрешением на чтение, у пользователя все равно будут права на изменение.

SetAccessRule()
Этот метод удаляет любой существующий доступ и заменяет этот доступ указанным правилом.
Если у пользователя есть разрешение на изменение и новое правило создается с помощью SetAccessRule(), указывающего разрешение на чтение, у этого пользователя теперь будет только разрешение на чтение.