Windows-এ ফাইল বা ফোল্ডারের এক্সেস ম্যানেজ করার জন্য NTFS ফাইল সিস্টেম অবজেক্টে (ফাইল বা ফোল্ডার) একটি বিশেষ ACL (Access Control List) অ্যাসাইন করা হয়। অবজেক্টের ACL সংজ্ঞায়িত করে যে কোনো ইউজার বা গ্রুপ ফাইল সিস্টেম অবজেক্টের সাথে কী কী অপারেশন (পারমিশন) পারফর্ম করতে পারবে। অধিকাংশ কেসে Windows অ্যাডমিন File Explorer গ্রাফিক্যাল ইন্টারফেস (ফাইল/ফোল্ডার প্রপার্টি → Security ট্যাব) বা icacls কনসোল টুল ব্যবহার করে NTFS পারমিশন ম্যানেজ করেন। এই লেখায় আমরা দেখব PowerShell কমান্ডলেট ব্যবহার করে NTFS অবজেক্টের পারমিশন কীভাবে ম্যানেজ করা যায়। আপনি এই কমান্ডগুলো আপনার স্ক্রিপ্টে বা Windows ফাইল সার্ভার ও ওয়ার্কস্টেশনে NTFS এক্সেস পারমিশন ম্যানেজমেন্ট অটোমেট করতে ব্যবহার করতে পারেন।

Get-Acl & Set-Acl: NTFS ACL ম্যানেজ করার বিল্ট-ইন PowerShell কমান্ডলেট
PowerShell v5 (Windows 10/Windows Server 2016)-এ NTFS ACL ম্যানেজ করার জন্য Microsoft.PowerShell.Security মডিউলের অংশ হিসেবে দুটি বিল্ট-ইন কমান্ডলেট রয়েছে:
- Get-Acl — NTFS ফাইল সিস্টেমের নির্দিষ্ট অবজেক্টের বর্তমান ACL পাওয়ার অনুমতি দেয়;
- Set-Acl — বর্তমান অবজেক্টের ACL যোগ/পরিবর্তন করতে ব্যবহৃত হয়।
আমরা এই বিল্ট-ইন কমান্ডলেটগুলো বিস্তারিত আলোচনা করব না, কারণ বাস্তব কাজে 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 স্ট্রিং-ও হিসেবে দেখানো হয়েছে — এই এক্সেস ডেসক্রিপশন ফরম্যাটে আমরা সংক্ষেপে নজর দিয়েছিলাম Windows Service Permissions সেট করার আর্টিকেলে।
NTFS পারমিশন তালিকা আরও ক্লিয়ার ফরম্যাটে দেখাতে পারেন:
(get-acl C:\docs\).access

একটি NTFS ফোল্ডার (অবজেক্ট) থেকে বর্তমান NTFS পারমিশন কপি করে অন্যটিতে প্রয়োগ করা যায়:
Get-Acl e:\old_docs | Set-Acl C:\docs
এটি করতে হলে অ্যাকাউন্ট অবজেক্টের মালিক হতে হবে এবং Take Ownership প্রিবিলেজ থাকতে হবে।
Set-ACL ব্যবহার করার মূল সমস্যা হলো কমান্ডলেটটি সবসময় রিসোর্সের মালিক পরিবর্তন করার চেষ্টা করে, এমনকি আপনি শুধু 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 অডিট সেটিংস ম্যানেজ করতে পারেন (দेखুন: Tracking down who removed files from shared folder) বা AD-এ বর্তমান OU ডেলিগেটেড পারমিশন সম্পর্কে।
NTFSSecurity PowerShell মডিউল দিয়ে ফাইল পারমিশন ম্যানেজ করা
যে কারণে আমি ইতিমধ্যে বলেছি, ফাইল সিস্টেম অবজেক্ট ম্যানেজ করার বিল্ট-ইন PowerShell কমান্ডলেটগুলো খুব সুবিধাজনক নয়। Windows-এ ফাইল ও ফোল্ডারের NTFS পারমিশন ম্যানেজ করতে PowerShell Gallery থেকে আলাদা মডিউল NTFSSecurity ব্যবহার করা উচিত। Install-Module -Name NTFSSecurity কমান্ড দিয়ে NTFSSecurity মডিউলটির লেটেস্ট ভার্সন (বর্তমানে 4.2.6) ইনস্টল করুন বা ম্যানুয়ালি ডাউনলোড করুন (লিংক)। ম্যানুয়ালি ইনস্টল করার কেসে আপনাকে শুধু মডিউল আর্কাইভ এক্সট্রাক্ট করতে হবে C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurity পাথে (ডাউনলোড করা ফাইল আনব্লক করা ভুলবেন না)।
NTFSSecurity মডিউল আপনার PowerShell সেশনে ইম্পোর্ট করুন:
Import-Module NTFSSecurity
মডিউলে উপলব্ধ কমান্ড তালিকা দেখান (৩৬টি কমান্ডলেট):
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 কমান্ডলেটগুলো কোনো ডেটা রিটার্ন করে না। কমান্ড এক্সিকিউশনের পর নতুন ACL দেখাতে -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
নিচের কমান্ড দিয়ে Administrator অ্যাকাউন্টকে ফোল্ডারের সব নেস্টেড অবজেক্টের মালিক বানানো যায়:
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 Effective Permissions দেখা
আপনি Get-EffectiveAccess কমান্ডলেট ব্যবহার করে নির্দিষ্ট ফাইল বা ফোল্ডারের জন্য ইফেক্টিভ 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 ফিল্ডে নির্দিষ্ট থাকে।