Windows में फ़ाइलों या फ़ोल्डरों तक पहुंच प्रबंधित करने के लिए, एक विशेष ACL (Access Control List) को NTFS फ़ाइल सिस्टम ऑब्जेक्ट (एक फ़ाइल या फ़ोल्डर) को असाइन किया जाता है। ऑब्जेक्ट का ACL उन ऑपरेशंस (अनुमतियों) को परिभाषित करता है जो एक उपयोगकर्ता या समूह फ़ाइल सिस्टम ऑब्जेक्ट के साथ कर सकते हैं। ज्यादातर मामलों में, Windows एडमिनिस्ट्रेटर File Explorer ग्राफिक इंटरफ़ेस (फ़ाइल/फ़ोल्डर गुण → Security टैब) या icacls कंसोल टूल का उपयोग करके फ़ाइलों या फ़ोल्डरों पर NTFS अनुमतियों को प्रबंधित करते हैं। इस लेख में हम देखेंगे कि PowerShell cmdlets का उपयोग करके NTFS ऑब्जेक्ट्स पर अनुमतियों को कैसे प्रबंधित करें। आप इन कमांड का उपयोग अपने स्क्रिप्ट में या Windows फ़ाइल सर्वर और वर्कस्टेशन पर NTFS एक्सेस अनुमतियों के प्रबंधन को स्वचालित करने के लिए कर सकते हैं।

Get-Acl और Set-Acl: NTFS ACL प्रबंधित करने के लिए बिल्ट-इन PowerShell Cmdlets
PowerShell v5 (Windows 10/Windows Server 2016) में, ACL प्रबंधित करने के लिए दो अलग बिल्ट-इन cmdlets हैं (Microsoft.PowerShell.Security मॉड्यूल का हिस्सा):
- Get-Acl — NTFS फ़ाइल सिस्टम पर विशिष्ट ऑब्जेक्ट के लिए वर्तमान ACL प्राप्त करने की अनुमति देता है;
- Set-Acl – वर्तमान ऑब्जेक्ट ACL को जोड़ने/बदलने के लिए उपयोग किया जाता है।
हम इन बिल्ट-इन cmdlets पर विस्तार से विचार नहीं करेंगे, क्योंकि ज्यादातर मामलों में उनकी विशेषताएं वास्तविक कार्यों में 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 स्ट्रिंग के रूप में भी प्रदर्शित किया जाता है — हमने इस एक्सेस विवरण प्रारूप को लेख Setting Windows Service Permissions में संक्षेप में देखा।
आप NTFS अनुमतियों की सूची केवल स्पष्ट प्रारूप में प्रदर्शित कर सकते हैं:
(get-acl C:\docs\).access

आप एक NTFS फ़ोल्डर (ऑब्जेक्ट) से वर्तमान NTFS अनुमतियों को कॉपी कर सकते हैं और उन्हें दूसरे पर लागू कर सकते हैं:
Get-Acl e:\old_docs | Set-Acl C:\docs
ऐसा करने के लिए, खाते को ऑब्जेक्ट का मालिक होना चाहिए और Take Ownership विशेषाधिकार होना चाहिए।
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) # पहला $True दिखाता है कि फ़ोल्डर सुरक्षित है या नहीं, दूसरा $True निर्दिष्ट करता है कि वर्तमान NTFS अनुमतियों को कॉपी करना है या नहीं
Set-Acl -Path $path -AclObject $acl
Get-Acl और Set-Acl का उपयोग करके, आप ऑब्जेक्ट्स के लिए NTFS ऑडिट सेटिंग्स प्रबंधित कर सकते हैं (लेख देखें: शेयर्ड फ़ोल्डर से फ़ाइलें किसने हटाईं ट्रैक करना) या AD में वर्तमान OU प्रतिनिधि अनुमतियों के बारे में।
NTFSSecurity PowerShell मॉड्यूल के साथ फ़ाइल अनुमतियों का प्रबंधन
जैसा कि मैंने पहले ही बताया, फ़ाइल सिस्टम ऑब्जेक्ट को प्रबंधित करने के लिए बिल्ट-इन PowerShell cmdlets बहुत सुविधाजनक नहीं हैं। Windows में फ़ाइलों और फ़ोल्डरों पर NTFS अनुमतियों को प्रबंधित करने के लिए आपको PowerShell गैलरी से एक अलग मॉड्यूल - NTFSSecurity का उपयोग करना चाहिए। आप Install-Module -Name NTFSSecurity कमांड का उपयोग करके NTFSSecurity मॉड्यूल का नवीनतम संस्करण (वर्तमान में 4.2.6) इंस्टॉल कर सकते हैं या इसे मैन्युअली डाउनलोड कर सकते हैं (लिंक)। मैन्युअली इंस्टॉल करते समय, आपको केवल मॉड्यूल आर्काइव को 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
टिप. डिफ़ॉल्ट रूप से, NTFSSecurity cmdlets कोई डेटा वापस नहीं करते हैं। कमांड निष्पादित होने के बाद नए ACLs प्रदर्शित करने के लिए -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
PowerShell के साथ NTFS प्रभावी अनुमतियों को कैसे देखें?
आप Get-EffectiveAccess cmdlet का उपयोग करके किसी विशिष्ट फ़ाइल या फ़ोल्डर के लिए प्रभावी NTFS अनुमतियों को देख सकते हैं। मान लीजिए, आपने किसी विशिष्ट फ़ोल्डर तक पहुंच कई AD सुरक्षा समूहों को दी है और आप जानना चाहते हैं कि क्या कोई विशिष्ट उपयोगकर्ता खाता (या SID) फ़ाइल फ़ोल्डर तक पहुंच सकता है। आप उन AD समूहों के सभी सदस्यों को सूचीबद्ध किए बिना जिनसे उपयोगकर्ता खाता संबंधित है, यह कैसे कर सकते हैं? यह वह मामला है जब प्रभावी 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 फ़ील्ड में निर्दिष्ट किया गया है।