Управління NTFS дозволами на папки і файли з PowerShell

Для управління доступом до файлів і папок в Windows на кожен об'єкт файлової системи NTFS (каталог або файл) призначається спеціальний ACL (Access Control List, список контролю доступу). В ACL об'єкта задаються доступні операції (дозволу), які може здійснювати з цим об'єктом користувач і / або групи. У більшості випадків адміністратори Window для управління NFTS дозволами на файли і папки використовують графічний інтерфейс File Explorer (властивості папки / файлу -> вкладка Security / Безпека) або консольну утиліту icacls. У цій статті ми розглянемо способи управління дозволами на об'єкти файлової системи NTFS з PowerShell. Ви можете використовувати ці команди в скриптах і для автоматизації управлінням NTFS дозволами на файлових серверах Windows.

зміст:

  • Вбудовані командлети для керування ACL в NTFS: Get-Acl і Set-Acl
  • Використовуємо модуль NTFSSecurity для управління дозволами з PowerShell
  • Перевірка ефективних NTFS дозволів на об'єкти з PowerShell

Вбудовані командлети для керування ACL в NTFS: Get-Acl і Set-Acl

У PowerShell v5 (Windows 10 / Windows Server 2016) для управління ACL є два окремих вбудованих командлет (входять в модуль Microsoft.PowerShell.Security):

  • Get-Acl - дозволяє отримати поточні ACL для конкретного об'єкта на файлову систему NTFS;
  • Set-Acl - використовується для додавання / зміни поточних ACL об'єкта.

Ми не будемо детально зупинятися на цих вбудованих Командлети, тому що їх функціонал в більшості випадків недостатній для управління NTFS дозволами в реальних задачах. Розглянемо лише кілька типових прикладів їх використання.

Виведемо поточного власника папки (файлу) і список призначених NTFS дозволів:

get-acl C: \ Drivers \ | fl

Path: Microsoft.PowerShell.Core \ FileSystem :: C: \ Drivers \
Owner: WORKSTAT1 \ root
Group: WORKSTAT1 \ Відсутня
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 дозволів в більш зрозумілому форматі:

(Get-acl C: \ Drivers \). Access

За допомогою стежить команди можна скопіювати 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:

$ Path = 'C: \ dist'
$ Acl = Get-ACL -Path $ path
$ Acl.SetAccessRuleProtection ($ True, $ True) # перший $ True вказує, чи є даний каталог захищеним, другий $ True - чи потрібно скопіювати поточні NTFS дозволу
Set-Acl -Path $ path -AclObject $ acl

Також за допомогою 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:

Import-Module NTFSSecurity

Виведемо список команд, доступних в модулі (доступно 36 командлетів):

Get-Command -Module NTFSSecurity

Виведемо поточні NTFS дозволу на каталог:
Get-Item 'c: \ distr' | Get-NTFSAccess

Як ви бачите, поточні дозволу представлені в більш зручній формі.

Щоб надати конкретному користувачу і групі групі повні права на папку, виконайте команду:
Add-NTFSAccess -Path C: \ distr -Account 'WORKSTAT1 \ confroom', 'BUILTIN \ Адміністратори' -AccessRights 'Fullcontrol' -PassThru

Порада. За замовчуванням командлети модуля NTFSSecurity не повертають ніяких даних, щоб команда після виконання виводила нові ACL, використовуйте параметр 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

Або ви можете перевірити ефективні дозволу на конкретний файл:

Get-Item -Path 'C: \ distr \ mstsc.exe.manifest' | Get-NTFSEffectiveAccess -Account 'WORKSTAT1 \ confroom' | Format-List