Mengelola izin NTFS pada folder dan file dari PowerShell

Untuk mengontrol akses ke file dan folder di Windows, ACL khusus (Daftar Kontrol Akses, Daftar Kontrol Akses) ditugaskan untuk setiap objek sistem file NTFS (direktori atau file). Objek ACL mendefinisikan operasi yang tersedia (izin) yang dapat dilakukan pengguna dan / atau grup dengan objek ini. Dalam kebanyakan kasus, administrator Window menggunakan File Explorer GUI (properti folder / file -> tab Security) atau utilitas konsol icacls untuk mengelola izin file dan folder NFTS. Pada artikel ini, kita akan melihat cara-cara untuk mengelola izin pada objek sistem file NTFS dari PowerShell. Anda dapat menggunakan perintah ini dalam skrip dan untuk mengotomatisasi pengelolaan izin NTFS pada server file Windows.

Konten:

  • Cmdlet bawaan untuk mengelola ACL di NTFS: Get-Acl dan Set-Acl
  • Kami menggunakan modul NTFSSecurity untuk mengelola izin dari PowerShell
  • Memeriksa Izin NTFS yang Efektif pada Objek dari PowerShell

Cmdlet bawaan untuk mengelola ACL di NTFS: Get-Acl dan Set-Acl

Di PowerShell v5 (Windows 10 / Windows Server 2016), ada dua cmdlet internal yang terpisah untuk mengelola ACL (termasuk dalam modul Microsoft.PowerShell.Security):

  • Dapatkan-acl - memungkinkan Anda untuk mendapatkan ACL saat ini untuk objek tertentu pada sistem file NTFS;
  • Set-acl - digunakan untuk menambah / memodifikasi objek ACL saat ini.

Kami tidak akan membahas cmdlet bawaan ini secara terperinci, seperti fungsi mereka dalam kebanyakan kasus tidak cukup untuk mengelola izin NTFS dalam tugas nyata. Mari kita perhatikan hanya beberapa contoh khas penggunaannya..

Daftar pemilik folder (file) saat ini dan daftar izin yang diberikan untuk NTFS:

get-acl C: \ Drivers \ | fl

Path: Microsoft.PowerShell.Core \ FileSystem :: C: \ Drivers \
Pemilik: WORKSTAT1 \ root
Grup: WORKSTAT1 \ Hilang
Akses: NT AUTHORITY \ Authenticated Users Allow Modify, Synchronize
NT AUTHORITY \ SYSTEM Memungkinkan Kontrol Lengkap
BUILTIN \ Administrator Mengizinkan Kontrol Penuh
BUILTIN \ Pengguna Mengizinkan ReadAndExecute, Sinkronisasi
WORKSTAT1 \ root Izinkan Ubah, Sinkronisasi
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) (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)

Seperti yang Anda lihat, izin saat ini juga disajikan sebagai string SDDL - kami secara singkat memeriksa format deskripsi akses ini di artikel Mengelola Hak untuk Layanan Windows.

Anda hanya bisa mendaftar izin NTFS dalam format yang lebih mudah dimengerti:

(dapatkan-acl C: \ Drivers \). akses

Menggunakan perintah berikut, Anda dapat menyalin izin NTFS dari satu folder dan menerapkannya ke yang lain:

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

Untuk melakukan operasi ini, akun harus menjadi pemilik sumber daya (Pemilik) dan memiliki hak Kepemilikan.

Masalah utama dengan menggunakan Set-ACL adalah bahwa cmdlet selalu mencoba untuk mengubah pemilik sumber daya, bahkan jika Anda hanya ingin mengubah izin NTFS. Akibatnya, untuk menambahkan hak ke objek, Anda perlu menggunakan konstruksi berikut:

$ path = "c: \ drivers"
$ user = "WORKSTAT1 \ user1"
$ Rights = "Baca, ReadAndExecute, ListDirectory"
$ InheritSettings = "Containerinherit, ObjectInherit"
$ PropogationSettings = "Tidak Ada"
$ RuleType = "Izinkan"
$ acl = Dapatkan-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

Untuk menghapus akses folder NTFS untuk pengguna atau grup:
$ path = "c: \ drivers"
$ acl = Dapatkan-Acl $ path
$ rules = $ acl.Access | di mana IsInherited -eq $ false
$ targetrule = $ rules | di mana IdentityReference -eq "WORKSTAT1 \ user1"
$ acl.RemoveAccessRule ($ targetrule)
$ acl | Set-Acl -Path $ path

Untuk menonaktifkan pewarisan folder dari PowerShell:

$ path = 'C: \ dist'
$ acl = Dapatkan-ACL -Path $ path
$ acl.SetAccessRuleProtection ($ True, $ True) # the pertama $ True menunjukkan apakah direktori ini dilindungi, $ True kedua - apakah akan menyalin izin NTFS saat ini
Set-Acl -Path $ path -AclObject $ acl

Juga, menggunakan Get-acl dan Set-Acl, Anda dapat mengontrol parameter audit objek NTFS (lihat artikel Siapa yang menghapus file di server?), Atau informasi tentang izin OU saat ini di AD.

Kami menggunakan modul NTFSSecurity untuk mengelola izin dari PowerShell

Seperti yang saya katakan, modul bawaan untuk mengelola ACL pada objek di PowerShell bukan yang paling nyaman. Untuk mengelola hak file dan folder NTFS pada Windows, lebih baik menggunakan modul galeri PowerShell yang terpisah - Keamanan NTFS. Versi terbaru dari modul NTFSSecurity (4.2.4 saat ini) dapat diinstal dengan perintah Instal-Modul -Nama NTFSSecurity, atau unduh secara manual (tautan). Untuk pemasangan manual, cukup membuka ritsleting isi arsip modul ke dalam C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ NTFSSecurity direktori (jangan lupa membuka kunci file yang diunduh).

Impor modul NTFSSecurity ke dalam sesi PowerShell:

Modul Impor NTFSSecurity

Mari kita buat daftar perintah yang tersedia di modul (tersedia 36 cmdlet):

Dapatkan-Perintah -Module NTFSSecurity

Daftar izin direktori NTFS saat ini:
Dapatkan-Barang 'c: \ distr' | Dapatkan-NTFSAccess

Seperti yang Anda lihat, izin saat ini disajikan dalam bentuk yang lebih nyaman..

Untuk memberikan pengguna tertentu dan grup hak penuh grup ke folder, jalankan perintah:
Tambah-NTFSAccess -Path C: \ distr -Akun 'WORKSTAT1 \ confroom', 'BUILTIN \ Administrator' -AccessRights 'Fullcontrol' -PassThru

Kiat. Secara default, cmdlet modul NTFSSecurity tidak mengembalikan data apa pun sehingga perintah menampilkan ACL baru setelah eksekusi, gunakan parameter Passthru.

Untuk memberikan hak hanya di tingkat atas dan tidak mengubah izin pada objek bersarang (hanya pada folder), gunakan perintah:

Tambah-NTFSAccess c: \ data \ public -Account corp \ aaivanov -AccessRights Ubah -AplikasiUntukFolder Ini Saja

Hapus izin yang diberikan untuk NTFS:

Hapus-NTFSAccess -Path C: \ distr -Akun 'WORKSTAT1 \ confroom' -AccessRights FullControl -PassThru

Perintah berikut dapat menghilangkan hak akun yang ditentukan untuk semua objek bersarang di folder yang ditentukan (izin yang diwarisi akan dilewati):

Dapatkan-ChildItem -Path C: \ distr -Recurse | Dapatkan-NTFSAccess -Akun 'WORKSTAT1 \ confroom' -KecualikanInherited | Hapus-NTFSAccess -PassThru

Perintah berikut ini dapat menjadikan akun Administrator sebagai pemilik semua objek bersarang di direktori:

Dapatkan-ChildItem -Path C: \ distr -Recurse -Force | Set-NTFSOwner -Account 'Administrator'

Untuk menghapus semua izin yang ditetapkan ke objek direktori secara manual (izin yang diwarisi tidak akan dihapus):

Dapatkan-ChildItem -Path C: \ distr -Recurse -Force | Hapus-NTFSAccess

Aktifkan warisan NTFS untuk semua objek di direktori:

Dapatkan-ChildItem -Path C: \ distr -Recurse -Force | Aktifkan-NTFSAccessInheritance

Untuk menampilkan semua izin yang ditetapkan secara manual, tidak termasuk izin yang diwarisi:

dir C: \ distr | Dapatkan-NTFSAccess -ExcludeInherited

Anda dapat menampilkan izin yang diberikan ke akun tertentu (jangan bingung dengan izin yang efektif, kami akan membicarakannya di bawah):

dir C: \ distr | Dapatkan-NTFSAccess -Account corp \ aaivanov

Memeriksa Izin NTFS yang Efektif pada Objek dari PowerShell

Anda bisa mengeceknya izin NTFS yang efektif ke file atau folder tertentu menggunakan cmdlet Dapatkan-EffectiveAccess. Misalkan Anda telah memberikan akses ke folder tertentu ke beberapa grup keamanan AD dan sekarang Anda ingin memahami apakah akun tertentu (SID) memiliki akses ke folder ini atau tidak. Bagaimana melakukan ini tanpa mendaftar grup AD yang memasukkan akunnya? Dalam situasi ini, fungsi memeriksa izin NTFS yang efektif akan membantu. Katakanlah Anda perlu memeriksa hak efektif semua subfolder di direktori untuk ruang pengguna.

Dapatkan-ChildItem -Path c: \ distr -Recurse -Directory | Dapatkan-NTFSEffectiveAccess -Akun 'WORKSTAT1 \ confroom' | pilih Akun, AccessControlType, AccessRights, FullName

Atau Anda dapat memeriksa izin efektif pada file tertentu:

Dapatkan-Item -Path 'C: \ distr \ mstsc.exe.manifest' | Dapatkan-NTFSEffectiveAccess -Akun 'WORKSTAT1 \ confroom' | Format-daftar