В NTFS для внутреннего разграничения доступа к данным используется список контроля доступа — Access Control List или ACL.
Для манипуляции с ACL в PowerShell есть два комадлета Get-ACL и Set-Acl, для получения и записи ACL объектов соответственно. Get-ACL получает объект типа System.Security.AccessControl.DirectorySecurity или System.Security.AccessControl.FileSecurity в зависимости от того на какой тип ресурса он будет применён.
Рассмотрим следующий пример изменения прав на существующей папке «D:\test».
|
1 2 3 4 |
$acl = Get-ACL -Path "D:\test" $Rule=new-object System.Security.AccessControl.FileSystemAccessRule "LocalComputer\Test","Read,Delete","ContainerInherit", "None","allow" $acl.AddAccessRule($Rule) Set-Acl -Path "D:\test" -AclObject $acl |
Get-ACL
|
1 |
$acl = Get-ACL -Path "D:\test" |
Здесь переменной $acl мы присваиваем значение acl таблицы папки «D:\test». При этом параметр -Path можно опустить и запись будет выглядеть так:
|
1 |
$acl = Get-ACL "D:\test" |
AddAccessRule
|
2 3 |
$Rule=new-object System.Security.AccessControl.FileSystemAccessRule "LocalComputer\Test","Read,Delete","ContainerInherit", "None","allow" $acl.AddAccessRule($Rule) |
Для того, что бы добавить права в нашу ACL сначала надо их обозначить, для этого создадим ещё одну переменную $Rule с типом System.Security.AccessControl.FileSystemAccessRule сразу, при создании объявим необходимые нам параметры:
1) с начала задаём имя пользователя или группы. В нашем примере «LocalComputer» это имя локального компьютера, вместо него можно указать ваш домен. «Test» — имя пользователя в место него можно указать имя группы.
2) Дальше идёт уровень предоставляемого доступа и может принимать следующие параметры:
| Уровень доступа | Значение параметра |
|---|---|
| Чтение | Read |
| Запись | Write |
| Изменение | Modify |
| Полный доступ | FullControl |
| Траверс / выполнение файлов | ExecuteFile |
| Содержание папки/чтение данных | ReadData |
| Чтение атрибутов | ReadAttributes |
| Чтение дополнительных атрибутов | ReadExtendedAttributes |
| Создание файлов/запись данных | CreateFiles |
| Создание папок /дозапись данных | AppendData |
| Запись атрибутов | WriteAttributes |
| Запись дополнительных атрибутов | WriteExtendedAttributes |
| Удаление подпапок и файлов | DeleteSubdirectoriesAndFiles |
| Удаление | Delete |
| Чтение разрешений | ReadPermissions |
| Смена разрешений | ChangePermissions |
| Смена владельца | TakeOwnership |
При этом параметры Read, Write, Modify и FullControl это Общие разрешения, которые содержат дополнительные разрешения:
| Уровень доступа | Значение параметра |
|---|---|
| Содержание папки/чтение данных | ReadData |
| Чтение атрибутов | ReadAttributes |
| Чтение дополнительных атрибутов | ReadExtendedAttributes |
| Чтение разрешений | ReadPermissions |
| Уровень доступа | Значение параметра |
|---|---|
| Создание файлов/запись данных | CreateFiles |
| Создание папок /дозапись данных | AppendData |
| Запись атрибутов | WriteAttributes |
| Запись дополнительных атрибутов | WriteExtendedAttributes |
| Чтение и выполнение/Список содержимого папки | ReadAndExecute |
| Траверс / выполнение файлов | ExecuteFile |
| Содержание папки/чтение данных | ReadData |
| Чтение атрибутов | ReadAttributes |
| Чтение дополнительных атрибутов | ReadExtendedAttributes |
| Чтение разрешений | ReadPermissions |
| Уровень доступа | Значение параметра |
|---|---|
| Траверс / выполнение файлов | ExecuteFile |
| Содержание папки/чтение данных | ReadData |
| Чтение атрибутов | ReadAttributes |
| Чтение дополнительных атрибутов | ReadExtendedAttributes |
| Создание файлов/запись данных | CreateFiles |
| Создание папок /дозапись данных | AppendData |
| Запись атрибутов | WriteAttributes |
| Запись дополнительных атрибутов | WriteExtendedAttributes |
| Удаление | Delete |
| Чтение разрешений | ReadPermissions |
| Уровень доступа | Значение параметра |
|---|---|
| Траверс / выполнение файлов | ExecuteFile |
| Содержание папки/чтение данных | ReadData |
| Чтение атрибутов | ReadAttributes |
| Чтение дополнительных атрибутов | ReadExtendedAttributes |
| Создание файлов/запись данных | CreateFiles |
| Создание папок /дозапись данных | AppendData |
| Запись атрибутов | WriteAttributes |
| Запись дополнительных атрибутов | WriteExtendedAttributes |
| Удаление подпапок и файлов | DeleteSubdirectoriesAndFiles |
| Удаление | Delete |
| Чтение разрешений | ReadPermissions |
| Смена разрешений | ChangePermissions |
| Смена владельца | TakeOwnership |
В нашем случае права состоят из основного параметра Read и дополнительного Delete.
3) Дальше идут два параметра наследования, можно использовать следующие сочитания:
| Параметр1,Параметр2 | Описание |
|---|---|
| #171;#187;»None»»»,»None» | Права применяются только для этой папки. |
| #171;#187;»ContainerInherit»»»,»None» | Права применяются для этой папки и её подпапок |
| #171;#187;»ObjectInherit»»»,»None» | Права применяются для этой папки и её файлов |
| #171;#187;»ContainerInherit,ObjectInherit»»»,»None» | Права применяются для этой папки её подпапок и файлов |
| #171;#187;»ContainerInherit»»», «InheritOnly» | Права применяются только для подпапок |
| #171;#187;»ObjectInherit»»», «InheritOnly» | Права применяются только для файлов |
| #171;#187;»ContainerInherit,ObjectInherit»»», «InheritOnly» | Права применяются только для подпапок и файлов |
Так же работают и другие сочитания данных параметров. По отдельности они значат следующее:
Первый параметр:
| Параметр | Описание |
|---|---|
| ContainerInherit | Элемент управления доступом наследуется дочерними объектами-контейнерами. |
| None | Элемент управления доступом не наследуется дочерними объектами. |
| ObjectInherit | Элемент управления доступом наследуется дочерними конечными объектами. |
Второй параметр:
| Параметр | Описание |
|---|---|
| InheritOnly | Указывает, что элемент управления доступом распространяется только на дочерние объекты. К ним относятся контейнеры и конечные дочерние объекты. |
| None | Указывает, что флаги наследования не установлены. |
| NoPropagateInherit | Указывает, что элемент управления доступом не распространяется на дочерние объекты. |
4) Последний параметр указывает это запрещающее или разрешающее правило, может принимать следующие значения:
| Параметр | Описание |
|---|---|
| Allow | Правило разрешает доступ к объекту |
| Deny | Правило запрещает доступ к объекту |
После того, как правило создано, мы можем добавить его к acl с помощью свойства AddAccessRule :
|
3 |
$acl.AddAccessRule($Rule) |
Set-Acl
|
4 |
Set-Acl -Path "D:\test" -AclObject $acl |
Теперь мы можем назначить наш объект acl обратно на ресурс. Это мы делаем с помощью командлета Set-Acl если опустить параметры Path и AclObject данная запись будет выглядеть так:
|
4 |
Set-Acl "D:\test" $acl |
Я бы тут обозначил, что это все справедливо для локального ПК
В домене для совершения подобных операций жа еще на удаленных ПК требую налияия прав доменного админа
Без таких пономочий для выполнения ACL в доменной среде, на ПК запросов требуется как минимум права локальноо администратора и в любом случае бубен.
Хотя тут еще от политик зависит =)
То, что вы говорите не совсем тема этой статьи… если быть точным то для раздачи прав на папку, у вас должны быть права раздавать права на эту папку. Да по умолчанию их имеет доменный админ. Но это далеко не единственная роль в домене обладающая такими правами. И если у вас мега большая контора, то доменный админ может и не заниматься такими глупостями… А создаст раздел, навешает на него прав… и уже совсем другие люди будут выдавать права на этот раздел. Возможно у них будут права только логиниться в систему и раздавать права именно в этом разделе.
С другой стороны если вы находитесь на локальном компе, то совершенно не факт, что вы имеете права менять уровни доступа для папок на своём рабочем столе… всякие бывают люди… и всякие бывают параноики в конторе. 🙂
Спасибо, мне помогло решить задачу на работе 🙂
Автору большое спасибо
Просто гигантское СПАСИБО!!!!
Тема крутая, кто может подсказать как ACE с неявными правами удалять?
Немного не понимаю о чём вы… 🙂 Какой такой туз 🙂
Но Если файл сбился с пути истинного и никого не произнаёт, то сначала надо стать его овнером. В самом плохом случае это может сделать локальный админ. После навешать нужные права, а там уже делай что хочешь .:)
А если нужно нескольким пользователям так права дать?
$Rule1=new-object System.Security.AccessControl.FileSystemAccessRule "LocalComputer\Test1","Read,Delete","ContainerInherit", "None","allow" $acl.AddAccessRule($Rule1)$Rule2=new-object System.Security.AccessControl.FileSystemAccessRule "LocalComputer\Test2","Read,Delete","ContainerInherit", "None","allow" $acl.AddAccessRule($Rule2)
так не работает
А что происходит? вроде всё верно
Всё нормально. Ничего не происходило потому что запускал без админских прав (UAC).