Раздача прав на NTFS из PowerShell.

В NTFS для внутреннего разграничения доступа к данным используется список контроля доступа — Access Control List или ACL.

Для манипуляции с ACL в PowerShell есть два комадлета Get-ACL и Set-Acl, для получения и записи ACL объектов соответственно. Get-ACL  получает объект типа System.Security.AccessControl.DirectorySecurity или System.Security.AccessControl.FileSecurity в зависимости от того на какой тип ресурса он будет применён.

Рассмотрим следующий пример изменения прав на существующей папке «D:\test».

Get-ACL

Здесь переменной $acl мы присваиваем значение acl таблицы папки «D:\test». При этом параметр -Path можно опустить и запись будет выглядеть так:

 

AddAccessRule

Для того, что бы добавить права в нашу 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 это Общие разрешения, которые содержат дополнительные разрешения:

Read
Уровень доступа Значение параметра
Содержание папки/чтение данных ReadData
Чтение атрибутов ReadAttributes
Чтение дополнительных атрибутов ReadExtendedAttributes
Чтение разрешений ReadPermissions
Write
Уровень доступа Значение параметра
Создание файлов/запись данных CreateFiles
Создание папок /дозапись данных AppendData
Запись атрибутов WriteAttributes
Запись дополнительных атрибутов WriteExtendedAttributes
Чтение и выполнение/Список содержимого папки ReadAndExecute
Траверс / выполнение файлов ExecuteFile
Содержание папки/чтение данных ReadData
Чтение атрибутов ReadAttributes
Чтение дополнительных атрибутов ReadExtendedAttributes
Чтение разрешений ReadPermissions
Modify
Уровень доступа Значение параметра
Траверс / выполнение файлов ExecuteFile
Содержание папки/чтение данных ReadData
Чтение атрибутов ReadAttributes
Чтение дополнительных атрибутов ReadExtendedAttributes
Создание файлов/запись данных CreateFiles
Создание папок /дозапись данных AppendData
Запись атрибутов WriteAttributes
Запись дополнительных атрибутов WriteExtendedAttributes
Удаление Delete
Чтение разрешений ReadPermissions
FullControl
Уровень доступа Значение параметра
Траверс / выполнение файлов 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 :

 

Set-Acl

Теперь мы можем назначить наш объект acl обратно на ресурс. Это мы делаем с помощью командлета Set-Acl если опустить параметры Path и AclObject данная запись будет выглядеть так:

 

Комментарии:

Комментарии 10

  • Я бы тут обозначил, что это все справедливо для локального ПК
    В домене для совершения подобных операций жа еще на удаленных ПК требую налияия прав доменного админа
    Без таких пономочий для выполнения 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)

    так не работает

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *