Для управління доступом до файлів і папок в 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)
Можна вивести тільки списки NTFS дозволів в більш зрозумілому форматі:
(Get-acl C: \ Drivers \). Access
За допомогою стежить команди можна скопіювати NTFS дозволу з однієї папки і застосувати їх на іншу:
Get-Acl C: \ Drivers | Set-Acl C: \ Distr
Головна проблема при використанні 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
Використовуємо модуль 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
Щоб надати права тільки на верхньому рівні і не змінювати дозволи на вкладені об'єкти (тільки на папку), використовуйте команду:
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