Управление на разрешенията за NTFS за папки и файлове от PowerShell

За контрол на достъпа до файлове и папки в 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)

Както можете да видите, текущите разрешения също се представят като низове SDDL - разгледахме накратко този формат на описание на достъпа в статията Управление на правата за Windows услуги.

Можете да изброите само разрешенията за 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

Също така, използвайки Get-acl и Set-Acl, можете да контролирате параметрите на NTFS одит на обекти (вижте статията Кой е изтрил файла на сървъра?) Или информация за текущите OU разрешения в AD.

Използваме модула за безопасност 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

съвет. По подразбиране командлетите на модула за сигурност на NTFSS не връщат никакви данни, така че командата показва нови ACL след изпълнение, използвайте параметъра 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' | Формат-Списък