В 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).