ในการจัดการการเข้าถึงไฟล์หรือโฟลเดอร์ใน Windows ACL (Access Control List) พิเศษถูกกำหนดให้กับวัตถุระบบไฟล์ NTFS (ไฟล์หรือโฟลเดอร์) ACL ของอ็อบเจ็กต์กำหนดการดำเนินการที่มีอยู่ (สิทธิ์) ที่ผู้ใช้หรือกลุ่มสามารถดำเนินการกับอ็อบเจ็กต์ระบบไฟล์ ในกรณีส่วนใหญ่ ผู้ดูแลระบบ Windows ใช้อินเทอร์เฟซกราฟิก File Explorer (คุณสมบัติของไฟล์/โฟลเดอร์ -> แท็บความปลอดภัย) หรือเครื่องมือคอนโซล icacls เพื่อจัดการสิทธิ์ NTFS ในไฟล์หรือโฟลเดอร์ ในบทความนี้ เราจะมาดูวิธีจัดการการอนุญาตบนวัตถุ NTFS โดยใช้ PowerShell cmdlets คุณสามารถใช้คำสั่งเหล่านี้ในสคริปต์ของคุณหรือจัดการสิทธิ์การเข้าถึง NTFS บนเซิร์ฟเวอร์ไฟล์และเวิร์กสเตชันของ Windows ได้โดยอัตโนมัติ
Get-Acl &Set-Acl:PowerShell Cmdlets ในตัวเพื่อจัดการ NTFS ACL
ใน PowerShell v5 (Windows 10/Windows Server 2016) มี cmdlet ในตัวสองตัวที่แยกจากกันเพื่อจัดการ ACL (ส่วนหนึ่งของ Microsoft.PowerShell.Security โมดูล):
- รับ-Acl — อนุญาตให้รับ ACL ปัจจุบันสำหรับวัตถุเฉพาะบนระบบไฟล์ NTFS
- Set-Acl – ใช้เพื่อเพิ่ม/เปลี่ยน ACL วัตถุปัจจุบัน
เราจะไม่พิจารณารายละเอียด cmdlet ในตัวเหล่านี้ เนื่องจากโดยส่วนใหญ่จะมีคุณสมบัติไม่เพียงพอสำหรับจัดการสิทธิ์ NTFS ในงานจริง มาดูกรณีการใช้งานทั่วไปกัน
ในการรับเจ้าของปัจจุบันของโฟลเดอร์ (ไฟล์) และรายการสิทธิ์ NTFS ที่กำหนด ให้รันคำสั่ง:
get-acl C:\docs\ |fl
Path : Microsoft.PowerShell.Core\FileSystem::C:\docs\ Owner : CORP\asmith Group : CORP\Domain Users Access : PC-7L7JAK6\root Allow ReadAndExecute, Synchronize BUILTIN\Administrators Allow FullControl NT AUTHORITY\SYSTEM Allow FullControl BUILTIN\Users Allow ReadAndExecute, Synchronize NT AUTHORITY\Authenticated Users Allow Modify, Synchronize NT AUTHORITY\Authenticated Users Allow -536805376 Audit : Sddl : O:S-1-5-21-2950832418-2342342341-4040681116-234234G:DUD:AI(A;OICI;0x1200a9;;;S-1-5-21-2601781602-2342342341-6543210895-1001)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;SY)(A;OICIID;0x1200a9;;;BU)(A;ID;0x1301bf;;;AU)(A;OICIIOID;SDGXGWGR;;;AU)อย่างที่คุณเห็น การอนุญาตปัจจุบันยังแสดงเป็น SDDl string — เราดูสั้น ๆ ที่รูปแบบคำอธิบายการเข้าถึงนี้ในบทความการตั้งค่าการอนุญาตบริการของ Windows
คุณสามารถแสดงรายการสิทธิ์ NTFS ในรูปแบบที่ชัดเจนเท่านั้น:
(get-acl C:\docs\).access
คุณสามารถคัดลอกสิทธิ์ NTFS ปัจจุบันจากโฟลเดอร์ NTFS (วัตถุ) และนำไปใช้กับโฟลเดอร์อื่นได้:
Get-Acl e:\old_docs | Set-Acl C:\docs
ปัญหาหลักของการใช้ Set-ACL คือ cmdlet พยายามเปลี่ยนเจ้าของทรัพยากรอยู่เสมอ แม้ว่าคุณเพียงแค่ต้องเปลี่ยนการอนุญาต NTFS ดังนั้นหากต้องการเพิ่มการอนุญาตบนวัตถุ คุณต้องใช้สคริปต์ที่ซับซ้อนต่อไปนี้:
$path = "c:\docs "
$user = "corp\DSullivan"
$Permiss = "Read, ReadAndExecute, ListDirectory"
$InheritSettings = "Containerinherit, ObjectInherit"
$PropogationSettings = "None"
$RuleType = "Allow"
$acl = Get-Acl $path
$perm = $user, $Permiss, $InheritSettings, $PropogationSettings, $RuleType
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $perm
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path $path
ในการลบการอนุญาต NTFS ในการเข้าถึงโฟลเดอร์สำหรับผู้ใช้หรือกลุ่ม:$path = "c:\docs"
$acl = Get-Acl $path
$rules = $acl.Access | where IsInherited -eq $false
$targetrule = $rules | where IdentityReference -eq "corp\DSullivan"
$acl.RemoveAccessRule($targetrule)
$acl | Set-Acl -Path $path
ในการปิดใช้งานการสืบทอดโฟลเดอร์จาก PowerShell:
$path = 'C:\docs
$acl = Get-ACL -Path $path
$acl.SetAccessRuleProtection($True, $True) # the first $True shows if the folder is protected, the second $True specifies if the current NTFS permissions have to be copied
Set-Acl -Path $path -AclObject $acl
การจัดการสิทธิ์ของไฟล์ด้วยโมดูล NTFSSecurity PowerShell
อย่างที่ฉันบอกไปแล้ว PowerShell cmdlets ในตัวเพื่อจัดการวัตถุระบบไฟล์ไม่สะดวกมาก ในการจัดการสิทธิ์ NTFS ในไฟล์และโฟลเดอร์ใน Windows คุณควรใช้โมดูลแยกต่างหากจากแกลเลอรี PowerShell – NTFSSecurity . คุณสามารถติดตั้งโมดูล NTFSSecurity เวอร์ชันล่าสุด (ปัจจุบันคือ 4.2.6) ได้โดยใช้ Install-Module -Name NTFSSecurity
คำสั่งหรือดาวน์โหลดด้วยตนเอง (ตามลิงค์) เมื่อทำการติดตั้งด้วยตนเอง คุณเพียงแค่แยกไฟล์เก็บถาวรของโมดูลไปที่ C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurity
(อย่าลืมปลดบล็อคไฟล์ที่ดาวน์โหลดมา)
นำเข้าโมดูล NTFSSecurity ไปยังเซสชัน PowerShell ของคุณ:
Import-Module NTFSSecurity
แสดงรายการคำสั่งที่มีอยู่ในโมดูล (36 cmdlets):
Get-Command -Module NTFSSecurity
แสดงรายการสิทธิ์ NTFS ปัจจุบันของโฟลเดอร์:Get-Item 'c:\docs' | Get-NTFSAccess
อย่างที่คุณเห็น การอนุญาตปัจจุบันจะแสดงในรูปแบบที่สะดวกยิ่งขึ้น
หากต้องการให้สิทธิ์การควบคุมแบบเต็มแก่ผู้ใช้หรือกลุ่มในโฟลเดอร์เฉพาะ ให้เรียกใช้คำสั่งนี้:Add-NTFSAccess -Path C:\docs -Account 'CORP\RShelby','BUILTIN\Administrators' -AccessRights 'Fullcontrol' -PassThru
หากต้องการให้สิทธิ์เฉพาะที่ระดับโฟลเดอร์บนสุดและไม่เปลี่ยนการอนุญาตบนวัตถุที่ซ้อนกัน (โฟลเดอร์เท่านั้น) ให้ใช้คำสั่งนี้:
Add-NTFSAccess c:\docs\public -Account corp\LMurkowski -AccessRights Modify -AppliesTo ThisFolderOnly
ในการลบการอนุญาต NTFS ที่กำหนด:
Remove-NTFSAccess -Path C:\DOCS -Account 'corp\LMurkowski' -AccessRights FullControl -PassThru
คำสั่งถัดไปจะลบการอนุญาตสำหรับวัตถุที่ซ้อนกันทั้งหมดในโฟลเดอร์สำหรับบัญชีที่กำหนด (การอนุญาตที่สืบทอดมาจะถูกข้าม):
Get-ChildItem -Path C:\docs -Recurse | Get-NTFSAccess -Account 'corp\LMurkowski' -ExcludeInherited |Remove-NTFSAccess -PassThru
ด้วยคำสั่งต่อไปนี้ คุณสามารถกำหนดให้บัญชีผู้ดูแลระบบเป็นเจ้าของออบเจ็กต์ที่ซ้อนกันทั้งหมดในโฟลเดอร์:
Get-ChildItem -Path C:\docs -Recurse -Force | Set-NTFSOwner -Account 'Administrator'
ในการล้างการอนุญาตทั้งหมดที่กำหนดให้กับวัตถุโฟลเดอร์ด้วยตนเอง (การอนุญาตที่สืบทอดจะไม่ถูกลบ):
Get-ChildItem -Path C:\docs -Recurse -Force | Clear-NTFSAccess
วิธีเปิดใช้งานการสืบทอด NTFS สำหรับออบเจ็กต์ทั้งหมดในโฟลเดอร์:
Get-ChildItem -Path C:\docs -Recurse -Force | Enable-NTFSAccessInheritance
หากต้องการแสดงสิทธิ์ทั้งหมดที่ได้รับมอบหมายด้วยตนเอง ยกเว้นสิทธิ์ที่สืบทอดมา:
dir C:\docs | Get-NTFSAccess –ExcludeInherited
คุณสามารถแสดงสิทธิ์ที่กำหนดให้กับบัญชีใดบัญชีหนึ่งได้ (อย่าสับสนกับการอนุญาตที่มีผล เราจะพูดถึงในภายหลัง):
dir C:\docs | Get-NTFSAccess -Account woshub\RShelby
จะดูการอนุญาตที่มีผลกับ NTFS ด้วย PowerShell ได้อย่างไร
คุณสามารถดูการอนุญาต NTFS ที่มีประสิทธิภาพ สำหรับไฟล์หรือโฟลเดอร์เฉพาะโดยใช้ Get-EffectiveAccess
cmdlet สมมติว่าคุณให้สิทธิ์เข้าถึงบางโฟลเดอร์ไปยังกลุ่มความปลอดภัย AD หลายกลุ่ม และต้องการทราบว่าบัญชีผู้ใช้เฉพาะ (หรือ SID) สามารถเข้าถึงโฟลเดอร์ไฟล์ได้หรือไม่ คุณจะทำอย่างไรโดยไม่ระบุสมาชิกทั้งหมดของกลุ่มโฆษณาที่เป็นของบัญชีผู้ใช้? นี่เป็นกรณีที่การดูการอนุญาต NTFS ที่มีประสิทธิภาพนั้นมีประโยชน์มาก ตัวอย่างเช่น คุณต้องดูการอนุญาตที่มีผลกับไดเรกทอรีที่ซ้อนกันทั้งหมดในโฟลเดอร์สำหรับบัญชีโดเมน confroom .
Get-ChildItem -Path c:\docs -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'corp\confroom’ | select Account, AccessControlType, AccessRights, FullName
หรือคุณสามารถดูการอนุญาตที่มีประสิทธิภาพสำหรับไฟล์บางไฟล์:
Get-Item -Path 'C:\docs\annual_report2019.xlsx' | Get-NTFSEffectiveAccess -Account 'corp\confroom' | Format-List
สิทธิ์ผู้ใช้ที่มีผลในปัจจุบันบนวัตถุระบบไฟล์ระบุไว้ใน AccessRights สนาม