За контрол на достъпа до файлове и папки в Windows, на всеки обект на файловата система (директория или файл) на NTFS е присвоен специален ACL (Списък за контрол на достъпа, Списък за контрол на достъпа). Обектът ACL определя наличните операции (разрешения), които потребител и / или групи могат да извършват с този обект. В повечето случаи администраторите на Window използват GUI File Explorer (свойства на папка / файл -> раздел „Защита“) или помощната програма за конзола icacls за управление на разрешенията за файлове и папки на NFTS. В тази статия ще разгледаме начините за управление на разрешенията за обекти на файловата система на NTFS от PowerShell. Можете да използвате тези команди в скриптове и да автоматизирате управлението на разрешенията за NTFS на файлови сървъри на Windows.
Съдържание:
- Вградени командлети за управление на ACL в NTFS: Get-Acl и Set-Acl
- Използваме модула за безопасност NTFSS за управление на разрешения от 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
Път: Microsoft.PowerShell.Core \ FileSystem :: C: \ Drivers \
Собственик: WORKSTAT1 \ root
Група: WORKSTAT1 \ Липсва
Достъп: NT AUTHORITY \ Автентифицирани потребители позволяват промяна, синхронизиране
NT AUTHORITY \ SYSTEM Разрешаване на FullControl
BUILTIN \ Администраторите позволяват FullControl
BUILTIN \ Потребителите позволяват ReadAndExecute, Synchronize
WORKSTAT1 \ root Разрешаване на промяна, синхронизиране
одит:
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 ;; -37664 51173-3310994491-1001)
Можете да изброите само разрешенията за NTFS в по-разбираем формат:
(get-acl C: \ Drivers \)
Използвайки следната команда, можете да копирате разрешенията на NTFS от една папка и да ги приложите в друга:
Get-Acl C: \ драйвери | Set-Acl C: \ Distr
Основният проблем при използването на Set-ACL е, че командлетът винаги се опитва да промени собственика на ресурса, дори ако просто искате да промените разрешенията на NTFS. В резултат на това, за да добавите права върху обекта, трябва да използвате тази конструкция:
$ path = "c: \ драйвери"
$ user = "WORKSTAT1 \ user1"
$ Rights = "Прочетете, прочетете и изпълнете, списъкDirectory"
$ InheritSettings = "Containerinherit, ObjectInherit"
$ PropogationSettings = "Няма"
$ RuleType = "Разрешаване"
$ acl = Get-Acl $ път
$ perm = $ потребител, $ права, $ InheritНастройки, $ PropogationSettings, $ RuleType
$ rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $ perm
$ acl.SetAccessRule ($ правило)
$ acl | Set-Acl -Path $ път
За да премахнете достъп до папка NTFS за потребител или група:
$ path = "c: \ драйвери"
$ acl = Get-Acl $ път
$ правила = $ acl.Access | където IsInherited -eq $ false
$ targetrule = $ правила | където IdentityReference -eq "WORKSTAT1 \ user1"
$ acl.RemoveAccessRule ($ targetrule)
$ acl | Set-Acl -Path $ път
За да деактивирате наследяването на папка от PowerShell:
$ path = 'C: \ dist'
$ acl = Get-ACL -Path $ път
$ acl.SetAccessRuleProtection ($ True, $ True) # първата $ True указва дали тази директория е защитена, втората $ True - дали да копирате текущите разрешения на NTFS
Set-Acl -Path $ path -AclObject $ acl
Използваме модула за безопасност NTFSS за управление на разрешения от PowerShell
Както казах, вграденият модул за управление на ACL на обекти в PowerShell не е най-удобният. За да управлявате правата за файлове и папки на NTFS в Windows, е по-добре да използвате отделен модул за галерия PowerShell - NTFSSecurity. Най-новата версия на модула за сигурност на NTFSSe (4.2.4 в момента) може да бъде инсталирана с командата Инсталиране-модул -Име NTFSSзащита
, или изтегляне ръчно (връзка). За ръчна инсталация е достатъчно да разархивирате съдържанието на архива на модула в директорията C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Модули \ NTFSSбезопасност (не забравяйте да отключите изтеглените файлове).
Импортирайте модула за NTFSS сигурност в сесия на PowerShell:
Импорт-модул NTFSSзащита
Нека изброим командите, налични в модула (36 cmdlets са на разположение):
Get-Command -Module NTFSS сигурност
Списък на текущите разрешения на директория NTFS:Get-Item 'c: \ distr' | Get-NTFSAccess
Както можете да видите, текущите разрешения са представени в по-удобна форма..
За да предоставите на конкретен потребител и да групирате група пълни права върху папката, изпълнете командата:Add-NTFSAccess -Path C: \ distr -Сметка 'WORKSTAT1 \ confroom', 'BUILTIN \ Administrators' -AccessRights 'Fullcontrol' -PassThru
За да предоставите права само на най-високо ниво и да не променяте разрешения за вложени обекти (само в папка), използвайте командата:
Add-NTFSAccess c: \ data \ public -Count corp \ aaivanov -AccessRights Промяна -AppliesTo ThisFolderOnly
Изтрийте разрешенията, присвоени на NTFS:
Remove-NTFSAccess -Path C: \ distr -Сметка 'WORKSTAT1 \ confroom' -AccessRights FullControl -PassThru
Следващата команда може да лиши зададените права на акаунт за всички вложени обекти в указаната папка (наследените разрешения ще бъдат пропуснати):
Get-ChildItem -Path C: \ distr -Recurse | Get-NTFSAccess -Сметка 'WORKSTAT1 \ confroom' -ExcludeInherited | Премахване-NTFSAccess -PassThru
Следващата команда може да направи акаунта на администратора собственик на всички вложени обекти в директорията:
Get-ChildItem -Path C: \ distr -Recurse -Force | Set-NTFSOwner - Сметка „Администратор“
За да изчистите ръчно всички разрешения, присвоени на обекти в директория (наследените разрешения няма да бъдат изтрити):
Get-ChildItem -Path C: \ distr -Recurse -Force | Clear-NTFSAccess
Активиране на NTFS наследяване за всички обекти в директорията:
Get-ChildItem -Path C: \ distr -Recurse -Force | Активиране-NTFSAccessInheritance
За да покажете всички разрешения, които са ръчно зададени, с изключение на наследените разрешения:
реж. C: \ distr | Вземете-NTFSAccess -ExcludeInherited
Можете да покажете разрешенията, присвоени на конкретен акаунт (не се бъркайте с ефективни разрешения, ще говорим за тях по-долу):
реж. C: \ distr | Get-NTFSAccess -Account corp \ aaivanov
Проверка на ефективни разрешения на NTFS за обекти от PowerShell
Можете да проверите ефективни NTFS разрешения до конкретен файл или папка с помощта на командлета Get-EffectiveAccess
. Да предположим, че сте предоставили достъп до папка на няколко групи за сигурност на AD и сега искате да разберете дали определен акаунт (SID) има достъп до тази папка или не. Как да направите това, без да изброявате групите AD, които включват неговия акаунт? В тази ситуация функцията за проверка на ефективни NTFS разрешения ще помогне. Да приемем, че трябва да проверите ефективните права на всички подпапки в директорията за потребителското пространство.
Get-ChildItem -Path c: \ distr -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'WORKSTAT1 \ confroom' | изберете Акаунт, AccessControlType, AccessRights, FullName
Или можете да проверите ефективните разрешения за конкретен файл:
Get-Item -Path 'C: \ distr \ mstsc.exe.manifest' | Get-NTFSEffectiveAccess -Account 'WORKSTAT1 \ confroom' | Формат-Списък