Давайте разберемся в том, как назначать ACL, то есть права доступа к файловым ресурсам, средствами Powershell
Немного теории
В ходе статьи будут использоваться такие понятия как ACL и ACE, поэтому для начала давайте разберемся что они из себя представляют и чем отличаются друг от друга.
ACL(Access Control List) — представляет собой таблицу, которая определяет права доступа к объектам файловой системы. Включает в себя записи ACE.
ACE(Access Control Entries) — представляет собой запись, входящую в таблицу ACL, которая сопоставляет пользователя и его права доступа к объекту, включая параметры наследования доступа.
Разница между ними в том, что в то время как ACE определяет только параметры доступа к объекту, ACL представляет из себя более емкую сущность, и хранит у себя в таблице, помимо самих ACE, записи о владельце файла, настройках аудита и других параметрах.
Назначение прав
# Считываем текущие параметры ACL для нашей папки $acl = Get-Acl C:\temp\Test # Посмотрим полученный ACL $acl | fl * # Создаем набор разрешений, который мы назначим папке $permission = “user1”,”fullcontrol”,”containerinherit,objectinherit”,”none”,”allow” # Смотрим текущие ACE $acl.Access # Создаем новый объект ACE на основе ранее записанных разрешений $ace = new-object security.accesscontrol.filesystemaccessrule $permission # Вносим сделанные изменения в исходный ACL $acl.setaccessrule($ace) # Назначаем ACL на выбранную папку $acl | set-acl C:\temp\Test
Подробней про ACE
Посмотрим на примере записи ACE имеющийся по умолчанию у всех объектов ФС
Какими бывают параметры ACE и принимаемые ими значения:
FileSystemRights — Уровень доступа
Принимает большое количество параметров. Можете ознакомиться тут.
Чаще всего встречаются «FullControl» либо «ReadAndExecute, Synchronize»
AccessControlType — Назначаемый тип доступа:
- Принимает значения Allow либо Deny
IdentityReference — определяет для какого пользователя или группы применяется ACE.
IsInherited — Указывает на то, была ли получена данная ACE запись от родительского объекта.
Соответствует графе в GUI «Унаследовано от\Inherited from»
- Принимает значения True либо False
PropagationFlags — Имеется только у папок. Доступны следующие значения:
- InheritOnly (IO) — указывает что ACE распространяется только на дочерние объекты(исключая текущую папку), к которым могут относится как файлы так и папки.
В GUI соответствует всем пунктам выпадающего меню которые не включают текущую папку( для параметра «Применяется к:») - NoPropagateInherit (NP) — обозначает что наследование не распространяется на дочерние объекты. В документации заявлено что данный флаг «Указывает, что ACE не распространяется на дочерние объекты»
На самом деле полное отключение наследования дает только использование области применения «Только эта папка».
А флаг NoPropagateInherit в свою очередь ограничивает глубину наследования только одним уровнем — то есть наследование ACE распространяется только на дочерние объекты, исключая более низкие уровни(grandchild objects)
Соответствует чекбоксу GUI «Применять эти разрешения к объектам и контейнерам только внутри этого контейнера«
InheritanceFlags — Так же имеется только у папок.
Определяет для каких типов объектов будут наследоваться разрешения от текущего объекта к дочерним.
Соответствует значению GUI «Применяется к\Applies to»
Принимает значения:
- ContainerInherit (CI) — наследование только для папок
- ObjectInherit (OI) — наследование только для файлов
Так же приведу таблицу с комбинациями всех флагов
Комбинация флагов => Результат наследования =========================================== 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).
Но по смыслу понятно что это любые объекты с глубиной наследования больше чем 1 уровень
В итоге
Вот и все!
На первый взгляд немного заумно, но в реальности ничего сложного:
- получили исходные ACL
- указали ACE которые нужно заменить
- назначили обновленный ACL на исходный объект