Powershell изменить владельца файла
Назначение прав доступа к файлам и каталогам при помощи PowerShell
В PowerShell существуют два коммандлета для работы со списками доступа: Get-Acl и Set-Acl.
Первый из них считывает права доступа и позволяет записать их в переменную. Второй – применяет права доступа к файлу или каталогу. И, хотя мы можем сохранить определенный набор прав доступа в файле csv или xml и позже применить его к нужным нам объектам, это все же не самый удобный и гибкий способ назначения прав. Нам нужна возможность редактирования существующих прав либо создание новых в самом сценарии без необходимости хранения набора xml- или csv-файлов с различными правами доступа.
Итак, по порядку.
Коммандлет Get-Acl считывает права доступа к папке и возвращает их в виде объекта класса ‘System.Security.AccessControl.DirectorySecurity’
Объекты этого класса обладают определенными свойствами и методами. Посмотреть их все можно при помощи коммандлета Get-Member
В этой статье мы рассмотрим те из них, которые относятся к Discretionary Access Control Lists (DACL), т.е. те, которые относятся к спискам управления доступом.
Свойства.
$acl.Access – выводит коллекцию объектов класса ‘System.Security.AccessControl.FileSystemAccessRule’
$acl.Group – выводит основную (primary) группу владельца объекта
$acl.Owner – выводит владельца объекта
$acl.Path – выводит путь к объекту
$acl.Sddl – выводит содержимое списка управления доступом в формате Security Descriptor Definition Language (SDDL)
$acl.AreAccessRilesProtected – если возвращаемое значение $true, это означает что наследование правил управления доступом от родительских объектов отсутствует, если же $false, этот файл или папка наследует правила от родительских объектов файловой системы.
$acl.AccessToString – выводит записи списка управления доступом в виде строк.
Методы.
Теперь рассмотрим полезные для нас методы, список которых мы можем получить, используя команду:
$acl.GetOwner() – получает владельца объекта.
В качестве параметра указывается тип представления результата метода.
$acl.SetOwner() – задает владельца объекта
В качества параметра указывается объект NTAccount либо SecurityIdentifier
$acl.GetAccessRules() – возвращает коллекцию записей списка управления доступом
includeInherited (Boolean) – указывает, выводить ли информацию о записях, наследуемых от родительского объекта файловой системы
targetType – указывает, в каком виде будут представлены значения поля IdentityReference.
В большинстве случаев это будут NTAccount, либо SecurityIdentifier.
Стоит поговорить о том, что из себя представляет вывод метода GetAccessRules.
Метод GetAccessRulesвозвращает объект класса System.Security.AccessControl.FileSystemRule, который представляет собой коллекцию записей списка управления доступом. Вывод метода аналогичен выводу свойства $acl.Access, с той разницей, что метод позволяет выбрать, выводить ли явные или наследуемые разрешения и в каком виде указывать учетные записи или группы пользователей-обладателей прав.
Поля записи управления доступом:
$acl.SetAccessRuleProtection – указывает, применяются ни наследуемые правила контроля доступа к данному объекту файловой системы.
preserveInheritance (Boolean) – применяется при отмене наследования, указывает, нужно ли скопировать наследуемые правила и применить их явно
$acl.AddAccessRule – добавляет запись к списку контроля доступа
В качестве параметра указывается объект класса ‘System.Security.AccessControl.FileSystemAccessRule’
Объект этого класса имеет единственное свойство value__, которое имеет вид двоичной маски, через которую и выражаются права доступа.
Этот параметр может задаваться несколькими способами.
Права доступа и соответствующие им числовые значения.
Права доступа | Битовая маска | Название прав при создании объекта |
Full Control | 2032127 | FullControl |
Traverse folder / Execute File | 32 | ExecuteFile |
List Folder / Read Data | 1 | ReadData |
Read Attributes | 128 | ReadAttributes |
Read Extended Attributes | 8 | ReadExtendedAttributes |
Create Files / Write Data | 2 | CreateFiles |
Create Folders / Append Data | 4 | AppendData |
Write Attributes | 256 | WriteAttributes |
Write Extended Attributes | 16 | WriteExtendedAttributes |
Delete Subfolders and Files | 64 | DeleteSubdirectoriesAndFiles |
Delete | 65536 | Delete |
Read Permissions | 131072 | ReadPermissions |
Change Permissions | 262144 | ChangePermissions |
Take Ownership | 524288 | TakeOwnership |
Наборы прав доступа и их значения.
Набор прав доступа | Права, входящие в набор | Битовая маска | Название прав при создании объекта |
Read | List Folder / Read Data | 131209 | Read |
Read Attributes | |||
Read Extended Attributes | |||
Read Permissions | |||
Write | Create Files / Write Data | 278 | Write |
Create Folders / Append Data | |||
Write Attributes | |||
Write Extended Attributes | |||
Read and Execute | Traverse folder / Execute File | 131241 | ReadAndExecute |
List Folder / Read Data | |||
Read Attributes | |||
Read Extended Attributes | |||
Read Permissions | |||
Modify | Traverse folder / Execute File | 197055 | Modify |
List Folder / Read Data | |||
Read Attributes | |||
Read Extended Attributes | |||
Create Files / Write Data | |||
Create Folders / Append Data | |||
Write Attributes | |||
Write Extended Attributes | |||
Delete | |||
Read Permissions |
Объект прав доступа не выделяет в отдельную категорию набор прав “ListFolderContents”, поскольку он отличается от “ReadAndExecute” только свойствами наследования, которые задаются при помощи других параметров
InheritanceFlags – этообъекткласса System.Security.AccessControl.InheritanceFlags
От также имеет единственное свойство value__, которое по сути определяет значение этого параметра
Значение параметра | Битовая маска |
None | 0 |
ContainerInherit | 1 |
ObjectInherit | 2 |
PropagationFlags – это объект класса System.Security.AccessControl.PropagationFlags
Имеет единственное свойство value__, определяющее значение параметра
Значение параметра | Битовая маска |
None | 0 |
NoPropagateInherit | 1 |
InheritOnly | 2 |
AccessControlType – объект класса System.Security.AccessControl.AccessControlType
Имеет единственное свойство value__, определяющее значение параметра
Значение параметра | Числовое значение |
Allow | 0 |
Deny | 1 |
При определении правила все значения, за исключением SID, могут указываться непосредственно в полях параметров в текстовом виде. Тем не менее, это не относится к указанию пользователя или группы в форме NTAccount. При создании правила, правильность заполнения параметра IdentityReferenceне проверяется, лишь в дальнейшем, при выполнении метода AddAccessRuleдля объекта FileSystemAccessRuleили других методов для работы с правилами может проявиться ошибка, указывающая, что метод не может произвести трансляцию указанной учетной записи в SID.
$acl.AccessRuleFactory – метод, используемый для создания правила. Может использоваться вместо процедуры, описанной выше.
Практически все используемые параметры уже были описаны, за исключением accessMask
Параметр AccessMask – это значение битовой маски прав доступа, т.е. свойство value__ объекта System.Security.AccessControl.FileSystemRights, значения которого, а также соответствующие ему права доступа приведены выше.
Значение битовой маски существующего правила (в данном случае – первого в списке) можно посмотреть так:
Также, при указании IdentityReference в данном методе не допускается ввод учетной записи непосредственно в параметрах в форме “domain\user”. В качестве параметра нужно указать переменную, содержащую объект класса “System.Security.Principal.NTAccount” либо “System.Security.Principal.SecurityIdentifier”, как это было указано выше.
$acl.SetAccessRule – замещает запись в списке контроля доступа.
Также как и метод AddAccessRule, данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’
В отличие от метода AddAccessRule, в котором указанная запись объединяется с существующей, данный метод полностью замещает разрешения доступа в данной записи.
Т.е., предположим, что для пользователя ‘domain\user’ к некоторой папке были применены разрешения доступа типа “Read”, и мы создаем объект класса ‘System.Security.AccessControl.FileSystemAccessRule’, в котором указываем права доступа “Write”
Используя метод $acl.AddAccessRule($rule), в результате мы получим права доступа “Read,Write”.
Используя же метод $aclSetAccessRule($rule), мы получим права доступа только “Write” т.к. предыдущая запись будет заменена на указанную в переменной $rule.
$acl.ResetAccessRule – удаляет все существующие записи контроля доступа для определенного участника безопасности и создает указанное в качестве параметра правило.
Этот метод отличается от метода $acl.SetAccessRule тем, что в случае использования метода ResetAccessRule, удаляются все записи контроля доступа для определенного участника безопасности, будь то записи ‘Allow’ или ‘Deny’. Что касается метода SetAccessRule, то он заменяет только тот тип правил (‘Allow’ или ‘Deny’), к которому относится правило, указанное в качестве параметра
$acl.RemoveAccessRule – удаляет определенные разрешения из правила для указанного участника безопасности.
Данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’
При использовании этого метода, мы можем убрать определенные разрешения из правила. Например, в списке контроля доступа определено правило, с типом ‘Allow’ и разрешениями ‘Read,Write’. Мы можем удалить разрешение Write, создав объект FileSystemAccessRule с типом ‘Allow’ и разрешением ‘Write’ и указав его в качестве параметра метода RemoveAccessRule
В результате, действующим останется только разрешение ‘Read’.
$acl.RemoveAccessRuleAll – удаляет запись определенного типа для указанного участника безопасности.
Данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’
Используя данный метод можно удалить запись определенного типа (‘Allow’ или ‘Deny’) для указанного участника безопасности. В качестве параметра нужно указать объект, представляющий собой правило контроля доступа. Но в отличие от предыдущего метода, достаточно указать нужного участника безопасности и тип правила (‘Allow’ или ‘Deny’). Разрешения же на доступ не обязательно должны соответствовать разрешениям удаляемого правила.
Например, в списке контроля доступа присутствует правило типа ‘Allow’, содержащее разрешения ‘Read,Write’. Мы можем создать объект FileSystemAccessRule с типом ‘Allow’ и разрешением ‘Read’ и указать его в качестве параметра метода RemoveAccessRuleAll.
Результатом будет полное удаление записи типа ‘Allow’ для данного участника безопасности.
$acl.RemoveRuleSpecific – данный метод удаляет правило, только в том случае, если параметры правила контроля доступа, указанного в качестве параметра метода, полностью соответствуют параметрам действующего правила.
Данный метод принимает в качестве входного параметра объект класса ‘System.Security.AccessControl.FileSystemAccessRule’
То есть, чтобы удалить правило типа ‘Allow’, содержащее разрешения ‘Read,Write’, параметры наследования ‘ContainerInherit,ObjectInherit’ и параметры распространения ‘None’, в качестве параметра мы должны указать объект правила контроля доступа с такими же параметрами. Если Разрешения будут отличаться, метод не окажет воздействия на действующее правило.
$acl.ModifyAccessRule – используется для изменения записи контроля доступа.
Параметр modification представляет из себя объект класса ‘System.Security.AccessControl.AccessControlModification’ и содержит единственное свойство value__, которое и определяет значение объекта.
Значение параметра | Числовое значение |
Add | 0 |
Set | 1 |
Reset | 2 |
Remove | 3 |
RemoveAll | 4 |
RemoveSpecific | 5 |
Параметр rule – объект класса ‘System.Security.AccessControl.FileSystemAccessRule’
Параметр mod – переменная типа Boolean. При успешном выполнении метода, ей присваивается значение $true. В данном методе должна указываться должна указываться с префиксом [ref].
$acl.PurgeAccessRules – удаляет запись контроля доступа для определенного участника безопасности
Данный метод принимает в качестве входного параметра объект ‘System.Security.Principal.IdentityReference’, который может представлять из себя объект класса NTAccount, либо SecurityIdentifier.
Отличие этого метода от предыдущих в том, что в качестве входного параметра он принимает объект участника безопасности и удаляет все правила (как ‘Allow’ так и ‘Deny’) для этой учетной записи.
$user.Translate(class)
Также хочется рассказать об одной полезной возможности, которой обладают классы System.Security.Principal.NTAccount и System.Security.Principal.SecurityIdentifier.
Каждый из этих классов обладает методом Translate, при помощи которого можно перевести объект безопасности из одного вида в другой.
Воспользуемся этим методом, чтобы трансформировать объект класса NTAccountв объект класса SecurityIdentifier.
Таким же образом можно трансформировать объекты класса SecurityIdentifier в объекты класса NTAccount.
Подведем итоги.
Основной способ ограничения доступа к файлам и папкам дает файловая система NTFS с ее таблицами ACL. Это может быть право только на чтение файла (открытие и просмотр), на чтение и запись (открытие, просмотр, изменение и сохранение) и многие другие. Такие права мы чаще устанавливаем через GUI назначая права не конечному пользователю, а группе в которой он состоит. Все действия по созданию и изменению мы так же можем сделать через Powershell.
Навигация по посту
На мой взгляд использование консоли Powershell лишнее при выдаче таких прав. Риск совершить ошибку в консоли намного выше, чем при работе в GUI, да и время для написания команды уйдет больше. Есть специфичные задачи, например в виде аудита или перенос прав где Powershell очень поможет.
Основы разрешений
ACL (access controll list) - делится на два вида:
- SACL (System Access Control List) - используется для аудита;
- DACL (Discretionary Access Control List) - используется для выдачи и проверки разрешений пользователям и группам.
Оба этих типа разрешений хранятся в специальной таблице MFT (Master File Table).
Основное средство для редактирования этих разрешений в GUI можно увидеть зайдя в свойства файла или папки:
В области 4 выделены следующие разрешения:
- Read - открытие файла и папки;
- List folder contents - открытие папки;
- Write - создание файлов и папок и их изменение;
- Read & Execute - открытие и запуск исполняемых файлов;
- Modify - открытие, создание, изменение и удаление файлов и папок;
- Full Control - включает разрешения modify, а так же управление разрешениями файла или папки.
Чаще всего мы работаем с разрешениями выше, но есть еще один список с возможностью настройки прав более тонко:
Как можно догадаться - разрешения указанные в области 1 это просто набор нескольких правил из области 3. Их так же еще называют "Premission Sets" и "Special Premissions".
Групповые разрешения могут принимать флаги Allow и Deny, которые разрешат или запретят указанные действия. Указывать разрешения для пользователей через Deny считается плохой практикой и практически не используется.
Кроме этого существует наследование:
Наследование помогает установить разрешения для одной папки так, что оно будет применяться ко вложенным файлам и папкам. Если наследование отключить (2), то у нас будет возможность убрать все наследуемые разрешения или оставить их.
Функции по работе со строками в Powershell
Получение текущих разрешений в Powershell
На примере ниже я верну разрешения для папки "C:\TestFolder\"
В области 1 выделен владелец папки, а под областью 2 отображаются все группы и пользователи с правами.
Мы можем проверять права не только локальной, но и сетевой папки. На примере ниже возвращена та же папка:
Поиск всех папок с правами у определенной группы
Представим, что мы хотим проверить права данные определенной группе. Мы можем заходить в свойства каждой папки и смотреть вкладку "Безопасности", а можем сделать это через Powershell.
Обычно у нас есть какой-то каталог с общим доступом с папками внутри, на которые мы выдаем разрешения. В моем случае такой каталог "Moscow", а на папки внутри я уже даю права:
В следующем примере я узнаю на какие папки установлены разрешения для TestGroup:
Изменение, копирование и добавление разрешений
Еще одна причина использовать Powershell - это возможность копирования разрешений. Например так я поставлю разрешения для папки Folder2 такие же, как и Folder2:
Возможности добавить нового пользователя в список ACL или изменить его права одним командлетом у нас нет. В обоих случаях мы должны будет создавать копию объекта ACL, изменять ее отдельным классом, а затем применять используя метод. Сам объект, который мы получаем через Get-ACL, имеет множество методов:
Для создания нового объекта с правами используется класс "FileSystemAccessRule", который в команде будет выглядеть так:
Расшифровать значения можно следующим образом:
- IdentityReference\String - пользователь или группа формата "DOMAIN\Administrator";
- FileSystemRights - сами разрешения, например "Read";
- InheritanceFlags и PropagationFlags - определяют наследование. Например вы можете сделать так, что папки внутри указанной будут наследовать разрешения, а файлы нет. Ниже будут приведены несколько примеров. Более подробно об этом можно почитать на сайте Microsoft;
- AccessCpmtrolType - разрешить или запретить (Allow/Deny).
Изменение и добавление прав у пользователя и групп
Допустим у нас есть пользователь "Test User (001)" с возможностью чтения папки "Folder1" и мы хотим добавить еще права на запись. Это будет выглядеть так:
Таким же образом работает добавление новой группы или пользователя в список ACL:
Права, которые мы можем дать имеют сокращенное название и они отображены далее:
У вас может быть много ошибок связанных с созданием класса с новыми разрешениями. Я бы советовал выводить существующие права и сравнивал бы их с новыми - это позволит снизить вероятность ошибок.
При этом вы можете применить набор разрешений, например в виде Write, но результат будет отображаться в виде "Special Premission":
Поэтому я рекомендую смотреть существующие разрешения на примере того, как я сделал это выше.
Удаление прав у пользователя или группы
Для удаления всех разрешений есть метод "RemoveAccessRuleAll". Работает он так же:
Для удаления конкретного права, например только возможность чтения, есть метод "RemoveAccessRule". С этим методом у меня были проблемы после которых действующие разрешения менялись на Special и изменить эту ситуацию у меня не получилось. Если вам нужно все же убрать одно разрешение - я бы советовал удалять все разрешения у пользователя, а затем добавлять их заново. У пользователя было право на Чтение и Запись, но мне нужно было оставить только чтение:
Смена владельца
Смена владельца файла или папки делается через метод SetOwner. Этот метод, в качестве идентификатора, принимает SID пользователя и что бы его узнать нужно использовать класс "System.Security.Principal.Ntaccount". На практике это выглядит так:
Как отсортировать в Powershell объекты через Sort-Object
Включение или отключение наследования папок и файлов
Для управления наследованием используется метод "SetAccessRuleProtection", который устанавливает следующее:
- Нужно ли блокирование от родительской папки.
- Нужна ли перезапись прав.
Значения указываются в $True или $False. Например так я включу наследование и заменю существующие разрешения родительскими:
Сбор всех прав и их экспорт в CSV
Учитывая примеры выше мы можем временно собирать отчеты по выданным правам. Пример того, как может выглядеть отчет:
Для управления доступом к файлам и папкам в Windows на каждый объект файловой системы NTFS (каталог или файл) назначается специальный ACL (Access Control List, список контроля доступа). В ACL объекта задаются доступные операции (разрешения), которые может совершать с этим объектом пользователь и/или группы . В большинстве случаев администраторы Window для управления NFTS разрешениями на файлы и папки используют графический интерфейс File Explorer (свойства папки/файла -> вкладка Security/Безопасность) или консольную утилиту icacls. В этой статье мы рассмотрим способы управления разрешениями на объекты файловой системы NTFS из PowerShell. Вы можете использовать эти команды в скриптах и для автоматизации управлением NTFS разрешениями на файловых серверах Windows.
Встроенные командлеты для управления ACL в NTFS: Get-Acl и Set-Acl
В PowerShell v5 (Windows 10 / Windows Server 2016) для управления ACL имеется два отдельных встроенных командлета (входят в модуль Microsoft.PowerShell.Security):
Мы не будем подробно останавливаться на этих встроенных командлетах, т.к. их функционал в большинстве случае недостаточен для управления NTFS разрешениями в реальных задачах. Рассмотрим лишь несколько типовых примеров их использования.
Выведем текущего владельца папки (файла) и список назначенных NTFS разрешений:
get-acl C:\Drivers\ |fl
Path : Microsoft.PowerShell.Core\FileSystem::C:\Drivers\
Owner : WORKSTAT1\root
Access : NT AUTHORITY\Authenticated Users Allow Modify, Synchronize
NT AUTHORITY\SYSTEM Allow FullControl
BUILTIN\Администраторы Allow FullControl
BUILTIN\Пользователи Allow ReadAndExecute, Synchronize
WORKSTAT1\root Allow Modify, Synchronize
Audit :
Sddl : O:S-1-5-21-3650440056-3766451173-3310994491-1001G:S-1-5-21-3650440056-766451173-3310994491-513D:PAI(A;OICI;0x 1301bf;;;AU)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)(A;OICI;0x1301bf;;;S-1-5-21-3650440056-37664 51173-3310994491-1001) Как вы видите, текущие разрешения также представлены в виде SDDL строки – мы вкратце рассматривали этот формат описания доступа в статье Управление правами на службы Windows.
Можно вывести только списки NTFS разрешений в более понятном формате:
С помощью следящей команды можно скопировать NTFS разрешения с одной папки и применить их на другую:
Get-Acl C:\Drivers | Set-Acl C:\Distr
Для выполнения этой операции учетная запись должна быть владельцем ресурса (Owner) и обладать правами Take Ownership.Главная проблема при использовании Set-ACL – командлет всегда пытается сменить владельца ресурса, даже если вы просто хотите изменить NTFS разрешения. В результате, чтобы добавить права на объект нужно использовать такую конструкцию:
$path = "c:\drivers"
$user = "WORKSTAT1\user1"
$Rights = "Read, ReadAndExecute, ListDirectory"
$InheritSettings = "Containerinherit, ObjectInherit"
$PropogationSettings = "None"
$RuleType = "Allow"
$acl = Get-Acl $path
$perm = $user, $Rights, $InheritSettings, $PropogationSettings, $RuleType
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $perm
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path $path
Чтобы убрать NTFS доступ к папке для пользователя или группы:
$path = "c:\drivers"
$acl = Get-Acl $path
$rules = $acl.Access | where IsInherited -eq $false
$targetrule = $rules | where IdentityReference -eq "WORKSTAT1\user1"
$acl.RemoveAccessRule($targetrule)
$acl | Set-Acl -Path $path
Чтобы отключить наследование для папки из PowerShell:
Также с помощью Get-acl и Set-Acl можно управлять параметрами NTFS-аудита объектов (см. статью Кто удалил файл на сервере?), либо информацией о текущих разрешениях на OU в AD.Используем модуль NTFSSecurity для управления разрешениями из PowerShell
Как я уже говорил, встроенный модуль для управления ACL на объекты в PowerShell не самый удобный. Для управления NTFS правами на файлы и папки в Windows лучше использовать отдельный модуль их галереи PowerShell – NTFSSecurity. Последнюю версию модуля NTFSSecurity (4.2.4 на данный момент) можно установить командой Install-Module -Name NTFSSecurity , или скачать вручную (линк). При ручной установке достаточно распаковать содержимое архива модуля в каталог C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurity (не забудьте разблокировать скачанные файлы).
Импортируйте модуль NTFSSecurity в сессию PowerShell:
Выведем список команд, доступных в модуле (доступно 36 командлетов):
Get-Command -Module NTFSSecurity
Выведем текущие NTFS разрешения на каталог:
Get-Item 'c:\distr' | Get-NTFSAccess
Как вы видите, текущие разрешения представлены в более удобной форме.
Чтобы предоставить конкретному пользователю и группе группе полные права на папку, выполните команду:
Add-NTFSAccess -Path C:\distr -Account 'WORKSTAT1\confroom','BUILTIN\Администраторы' -AccessRights 'Fullcontrol' -PassThru
Чтобы предоставить права только на верхнем уровне и не изменять разрешения на вложенные объекты (только на папку), используйте команду:
Add-NTFSAccess c:\data\public -Account corp\aaivanov -AccessRights Modify -AppliesTo ThisFolderOnly
Удалить назначенные NTFS разрешения:
Remove-NTFSAccess -Path C:\distr -Account 'WORKSTAT1\confroom' -AccessRights FullControl -PassThru
Следующей командой можно лишить указанную учетную прав на все вложенные объекты в указанной папке (наследованные разрешения будут пропущены):
Get-ChildItem -Path C:\distr -Recurse | Get-NTFSAccess -Account 'WORKSTAT1\confroom' -ExcludeInherited |Remove-NTFSAccess -PassThru
Следующей командой можно назначить учетную запись Administrator владельцем всех вложенных объектов в каталоге:
Get-ChildItem -Path C:\distr -Recurse -Force | Set-NTFSOwner -Account 'Administrator'
Чтобы очистить все разрешения, назначенные на объекты каталога вручную (не будет удалены унаследованные разрешения):
Get-ChildItem -Path C:\distr -Recurse -Force | Clear-NTFSAccess
Включить NTFS наследование для всех объектов в каталоге:
Get-ChildItem -Path C:\distr -Recurse -Force | Enable-NTFSAccessInheritance
Чтобы вывести все разрешения, которые назначены вручную, исключая унаследованные разрешения:
dir C:\distr | Get-NTFSAccess –ExcludeInherited
Можно вывести разрешения, назначенные для определенного аккаунта (не путайте с эффективными разрешениями, речь о них ниже):
dir C:\distr | Get-NTFSAccess -Account corp\aaivanov
Проверка эффективных NTFS разрешений на объекты из PowerShell
Вы можете проверить эффективные NTFS разрешения на конкретный файл или папку с помощью командлета Get-EffectiveAccess . Допустим вы предоставили доступ на некоторую папку нескольким группам безопасности AD и теперь хотите понять, есть ли у конкретного аккаунта (SID) доступ к данной папке или нет. Как это сделать, не выводя состав групп AD, в которых входит его учетная запись? В этой ситуации как раз поможет функция проверки эффективные NTFS разрешений. Допустим, нужно проверить эффективные права на все вложенные папки в каталоге для пользователя confroom.
Get-ChildItem -Path c:\distr -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'WORKSTAT1\confroom' | select Account, AccessControlType, AccessRights, FullName
Основной способ ограничения доступа к файлам и папкам дает файловая система NTFS с ее таблицами ACL. Это может быть право только на чтение файла (открытие и просмотр), на чтение и запись (открытие, просмотр, изменение и сохранение) и многие другие. Такие права мы чаще устанавливаем через GUI назначая права не конечному пользователю, а группе в которой он состоит. Все действия по созданию и изменению мы так же можем сделать через Powershell.
На мой взгляд использование консоли Powershell лишнее при выдаче таких прав. Риск совершить ошибку в консоли намного выше, чем при работе в GUI, да и время для написания команды уйдет больше. Есть специфичные задачи, например в виде аудита или перенос прав где Powershell очень поможет.
Основы разрешений
Оба этих типа разрешений хранятся в специальной таблице MFT (Master File Table).
Основное средство для редактирования этих разрешений в GUI можно увидеть зайдя в свойства файла или папки:
В области 4 выделены следующие разрешения:
Чаще всего мы работаем с разрешениями выше, но есть еще один список с возможностью настройки прав более тонко:
Групповые разрешения могут принимать флаги Allow и Deny, которые разрешат или запретят указанные действия. Указывать разрешения для пользователей через Deny считается плохой практикой и практически не используется.
Кроме этого существует наследование:
Наследование помогает установить разрешения для одной папки так, что оно будет применяться ко вложенным файлам и папкам. Если наследование отключить (2), то у нас будет возможность убрать все наследуемые разрешения или оставить их.
Читайте также: