Zarządzanie uprawnieniami NTFS do folderów i plików z PowerShell

Aby kontrolować dostęp do plików i folderów w systemie Windows, specjalna lista kontroli dostępu (lista kontroli dostępu, lista kontroli dostępu) jest przypisana do każdego obiektu systemu plików NTFS (katalogu lub pliku). Obiekt ACL definiuje dostępne operacje (uprawnienia), które użytkownik i / lub grupy mogą wykonywać z tym obiektem. W większości przypadków administratorzy systemu Windows używają interfejsu GUI Eksploratora plików (właściwości folderu / pliku -> karta Zabezpieczenia) lub narzędzia konsoli icacls do zarządzania uprawnieniami do plików NFTS i folderów. W tym artykule przyjrzymy się sposobom zarządzania uprawnieniami do obiektów systemu plików NTFS z PowerShell. Możesz użyć tych poleceń w skryptach i zautomatyzować zarządzanie uprawnieniami NTFS na serwerach plików Windows.

Treść

  • Wbudowane polecenia cmdlet do zarządzania listami ACL w systemie plików NTFS: Get-Acl i Set-Acl
  • Używamy modułu NTFSSecurity do zarządzania uprawnieniami z PowerShell
  • Sprawdzanie efektywnych uprawnień NTFS do obiektów z PowerShell

Wbudowane polecenia cmdlet do zarządzania listami ACL w systemie plików NTFS: Get-Acl i Set-Acl

W programie PowerShell v5 (Windows 10 / Windows Server 2016) istnieją dwa osobne wbudowane polecenia cmdlet do zarządzania listami ACL (zawarte w module Microsoft.PowerShell.Security):

  • Get-acl - pozwala uzyskać bieżącą listę ACL dla określonego obiektu w systemie plików NTFS;
  • Zestaw acl - służy do dodawania / modyfikowania bieżących list ACL obiektów.

Nie będziemy omawiać szczegółowo tych wbudowanych poleceń cmdlet, jak ich funkcjonalność w większości przypadków jest niewystarczająca do zarządzania uprawnieniami NTFS w rzeczywistych zadaniach. Rozważmy tylko kilka typowych przykładów ich użycia..

Wyświetl aktualnego właściciela folderu (pliku) i listę uprawnień przypisanych do NTFS:

get-acl C: \ Drivers \ | fl

Ścieżka: Microsoft.PowerShell.Core \ FileSystem :: C: \ Drivers \
Właściciel: WORKSTAT1 \ root
Grupa: WORKSTAT1 \ Missing
Dostęp: NT AUTHORITY \ Authentified Users Allow Modyfikuj, synchronizuj
NT AUTHORITY \ SYSTEM Zezwól na FullControl
BUILTIN \ Administrators Allow FullControl
BUILTIN \ Users Allow ReadAndExecute, Synchronize
WORKSTAT1 \ root Zezwól na modyfikację, synchronizację
Audyt:
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)

Jak widać, obecne uprawnienia są również przedstawiane jako ciągi SDDL - krótko przeanalizowaliśmy ten format opisu dostępu w artykule Zarządzanie prawami dla usług Windows.

Możesz wymienić uprawnienia NTFS tylko w bardziej zrozumiałym formacie:

(get-acl C: \ Drivers \). dostęp

Za pomocą następującego polecenia możesz skopiować uprawnienia NTFS z jednego folderu i zastosować je do innego:

Get-Acl C: \ Drivers | Set-Acl C: \ Distr

Aby wykonać tę operację, konto musi być właścicielem zasobu (Właścicielem) i mieć prawa do przejęcia na własność.

Główny problem z używaniem Set-ACL polega na tym, że cmdlet zawsze próbuje zmienić właściciela zasobu, nawet jeśli chcesz tylko zmienić uprawnienia NTFS. W związku z tym, aby dodać prawa do obiektu, musisz użyć następującej konstrukcji:

$ path = "c: \ drivers"
$ user = "WORKSTAT1 \ user1"
$ Rights = "Read, ReadAndExecute, ListDirectory"
$ InheritSettings = "Containerinherit, ObjectInherit"
$ PropogationSettings = "Brak"
$ RuleType = "Zezwól"
$ acl = ścieżka Get-Acl $
$ perm = $ user, $ Rights, $ InheritSettings, $ PropogationSettings, $ RuleType
$ rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $ perm
$ acl.SetAccessRule ($ rule)
$ acl | Ścieżka Set-Acl -Path $

Aby usunąć dostęp do folderu NTFS dla użytkownika lub grupy:
$ path = "c: \ drivers"
$ acl = ścieżka Get-Acl $
$ rules = $ acl.Access | gdzie IsInherited -eq $ false
$ targetrule = $ rules | gdzie IdentityReference -eq „WORKSTAT1 \ użytkownik1”
$ acl.RemoveAccessRule ($ targetrule)
$ acl | Ścieżka Set-Acl -Path $

Aby wyłączyć dziedziczenie folderu z PowerShell:

$ path = 'C: \ dist'
$ acl = Get-ACL -Path $ ścieżka
$ acl.SetAccessRuleProtection ($ True, $ True) # pierwsze $ True wskazuje, czy ten katalog jest chroniony, drugie $ True - czy skopiować bieżące uprawnienia NTFS
Set-Acl -Path $ path -AclObject $ acl

Ponadto za pomocą Get-acl i Set-Acl możesz kontrolować parametry kontroli NTFS obiektów (zobacz artykuł Kto usunął plik na serwerze?) Lub informacje o aktualnych uprawnieniach OU w AD.

Używamy modułu NTFSSecurity do zarządzania uprawnieniami z PowerShell

Jak powiedziałem, wbudowany moduł do zarządzania listami ACL obiektów w programie PowerShell nie jest najwygodniejszy. Aby zarządzać prawami do plików i folderów NTFS w systemie Windows, lepiej jest użyć osobnego modułu galerii PowerShell - NTFSSecurity. Najnowszą wersję modułu NTFSSecurity (obecnie 4.2.4) można zainstalować za pomocą polecenia Install-Module -Name NTFSSecurity, lub pobierz ręcznie (link). Do ręcznej instalacji wystarczy rozpakować zawartość archiwum modułu do katalogu C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ NTFSSecurity (nie zapomnij odblokować pobranych plików).

Zaimportuj moduł NTFSSecurity do sesji PowerShell:

Moduł importu NTFSSecurity

Wymieńmy polecenia dostępne w module (dostępnych jest 36 cmdletów):

Get-Command -Moduł NTFSSecurity

Wyświetl aktualne uprawnienia do katalogu NTFS:
Pobierz element „c: \ distr” | Get-NTFSAccess

Jak widać, bieżące uprawnienia są przedstawione w wygodniejszej formie..

Aby nadać określonemu użytkownikowi i zgrupować grupę pełne prawa do folderu, uruchom polecenie:
Dodaj-NTFSAccess -Path C: \ distr -Account „WORKSTAT1 \ confroom”, „BUILTIN \ Administrators” -AccessRights „Fullcontrol” -PassThru

Wskazówka. Domyślnie polecenia cmdlet modułu NTFSSecurity nie zwracają żadnych danych, więc po wykonaniu polecenia wyświetla nowe listy ACL, użyj parametru Passthru.

Aby przyznać uprawnienia tylko na najwyższym poziomie i nie zmieniać uprawnień do obiektów zagnieżdżonych (tylko do folderu), użyj polecenia:

Dodaj-NTFSAccess c: \ data \ public -Account corp \ aaivanov -AccessRights Modify -AppliesTo ThisFolderOnly

Usuń uprawnienia przypisane do NTFS:

Usuń-NTFSAccess -Path C: \ distr -Account 'WORKSTAT1 \ confroom' -AccessRights FullControl -PassThru

Następujące polecenie może pozbawić określone prawa konta wszystkich zagnieżdżonych obiektów w określonym folderze (uprawnienia dziedziczone zostaną pominięte):

Get-ChildItem -Path C: \ distr -Recurse | Uzyskaj-NTFSAccess -Konto „WORKSTAT1 \ confroom” -ExcludeInherited | Usuń-NTFSAccess -PassThru

Następujące polecenie może uczynić konto administratora właścicielem wszystkich zagnieżdżonych obiektów w katalogu:

Get-ChildItem -Path C: \ distr -Recurse -Force | Ustaw-NTFSOwner - konto „Administrator”

Aby ręcznie wyczyścić wszystkie uprawnienia przypisane do obiektów katalogu (uprawnienia odziedziczone nie zostaną usunięte):

Get-ChildItem -Path C: \ distr -Recurse -Force | Wyczyść-NTFSAccess

Włącz dziedziczenie NTFS dla wszystkich obiektów w katalogu:

Get-ChildItem -Path C: \ distr -Recurse -Force | Włącz-NTFSAccessInheritance

Aby wyświetlić wszystkie uprawnienia przypisane ręcznie, z wyjątkiem uprawnień odziedziczonych:

reż C: \ distr | Get-NTFSAccess -ExcludeInherited

Możesz wyświetlić uprawnienia przypisane do konkretnego konta (nie mylić ze skutecznymi uprawnieniami, omówimy je poniżej):

reż C: \ distr | Get-NTFSAccess -Account corp \ aaivanov

Sprawdzanie efektywnych uprawnień NTFS do obiektów z PowerShell

Możesz sprawdzić skuteczne uprawnienia NTFS do określonego pliku lub folderu za pomocą polecenia cmdlet Get-EffectiveAccess. Załóżmy, że przyznałeś dostęp do określonego folderu kilku grupom zabezpieczeń AD, a teraz chcesz zrozumieć, czy dane konto (SID) ma dostęp do tego folderu, czy nie. Jak to zrobić, nie wymieniając grup AD, które zawierają jego konto? W tej sytuacji pomoże sprawdzenie efektywnych uprawnień NTFS. Powiedzmy, że musisz sprawdzić efektywne prawa do wszystkich podfolderów w katalogu dla konfesjonału użytkownika.

Get-ChildItem -Path c: \ distr -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'WORKSTAT1 \ confroom' | wybierz Konto, AccessControlType, AccessRights, FullName

Lub możesz sprawdzić efektywne uprawnienia do określonego pliku:

Get-Item -Path 'C: \ distr \ mstsc.exe.manifest' | Get-NTFSEffectiveAccess -Account 'WORKSTAT1 \ confroom' | Lista formatów