PowerShell ile NTFS İzinleri Nasıl Yönetilir?


Windows'ta dosyalara veya klasörlere erişimi yönetmek için, bir NTFS dosya sistemi nesnesine (bir dosya veya klasör) özel bir ACL (Erişim Kontrol Listesi) atanır. Nesnenin ACL'si, bir kullanıcının veya grupların dosya sistemi nesnesiyle gerçekleştirebileceği mevcut işlemleri (izinleri) tanımlar. Çoğu durumda, Windows yöneticileri dosya veya klasörlerdeki NTFS izinlerini yönetmek için Dosya Gezgini grafik arayüzünü (dosya/klasör özellikleri -> Güvenlik sekmesi) veya icacls konsol aracını kullanır. Bu yazıda, PowerShell cmdlet'lerini kullanarak NTFS nesnelerindeki izinlerin nasıl yönetileceğine bakacağız. Bu komutları betiklerinizde veya Windows dosya sunucuları ve iş istasyonlarında NTFS erişim izinlerinin yönetimini otomatikleştirmek için kullanabilirsiniz.

Get-Acl & Set-Acl: NTFS ACL'lerini Yönetmek için Yerleşik PowerShell Cmdlet'leri

PowerShell v5'te (Windows 10/Windows Server 2016), ACL'yi yönetmek için iki ayrı yerleşik cmdlet vardır (Microsoft.PowerShell.Security modülünün bir parçası):

  • Get-Acl — NTFS dosya sistemindeki belirli nesne için geçerli ACL'lerin alınmasına izin verir;

  • Set-Acl - geçerli nesne ACL'sini eklemek/değiştirmek için kullanılır.

Çoğu durumda özellikleri gerçek görevlerde NTFS izinlerini yönetmek için yeterli olmadığından, bu yerleşik cmdlet'leri ayrıntılı olarak ele almayacağız. Bazı tipik kullanım durumları üzerinde duralım.

Bir klasörün (dosyanın) geçerli sahibini ve atanmış NTFS izinlerinin listesini almak için şu komutu çalıştırın:

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)

Gördüğünüz gibi, geçerli izinler SDDl dizesi olarak da görüntüleniyor — Windows Hizmet İzinlerini Ayarlama makalesinde bu erişim açıklama biçimine kısaca baktık.

NTFS izin listelerini yalnızca daha net bir biçimde görüntüleyebilirsiniz:

(get-acl C:\docs\).access

Geçerli NTFS izinlerini bir NTFS klasöründen (nesne) kopyalayabilir ve başka bir klasöre uygulayabilirsiniz:

Get-Acl e:\old_docs | Set-Acl C:\docs

Bunu yapmak için, hesabın nesnenin sahibi olması ve Sahipliği Al ayrıcalığına sahip olması gerekir.

Set-ACL kullanmanın ana sorunu, yalnızca NTFS izinlerini değiştirmeniz gerekse bile cmdlet'in her zaman kaynak sahibini değiştirmeye çalışmasıdır. Bu nedenle, bir nesneye izinleri eklemek için aşağıdaki karmaşık komut dosyasını kullanmanız gerekir:


$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

Bir kullanıcı veya grubun bir klasöre erişmesine yönelik NTFS iznini kaldırmak için:

$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'den klasör devralmayı devre dışı bırakmak için:

$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

Ayrıca, Get-Acl ve Set-Acl'yi kullanarak nesneler için NTFS denetim ayarlarını yönetebilirsiniz (Paylaşılan klasörden dosyaları kimin kaldırdığını takip etme makalelerine bakın) veya AD'deki mevcut OU Delegated izinleri hakkında.

NTFSSecurity PowerShell Modülü ile Dosya İzinlerini Yönetme

Daha önce de söylediğim gibi, dosya sistemi nesnesini yönetmek için yerleşik PowerShell cmdlet'leri pek kullanışlı değil. Windows'ta dosya ve klasörlerdeki NTFS izinlerini yönetmek için, PowerShell galerisinden ayrı bir modül olan NTFSSecurity kullanmanız daha iyi olacaktır. NTFSSecurity modülünün en son sürümünü (şu anda 4.2.6) kullanarak yükleyebilirsiniz.

Install-Module -Name NTFSSecurity

komut verin veya manuel olarak indirin (bağlantı). Manuel olarak kurarken, modül arşivini klasöre çıkartmanız yeterlidir.

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurity 

(indirilen dosyanın engellemesini kaldırmayı unutmayın).

NTFSSecurity modülünü PowerShell oturumunuza aktarın:

Import-Module NTFSSecurity

Modülde bulunan komutların listesini görüntüleyin (36 cmdlet):

Get-Command -Module NTFSSecurity

Klasörün mevcut NTFS izinlerini listeleyin:

Get-Item 'c:\docs' | Get-NTFSAccess

Gördüğünüz gibi, mevcut izinler daha uygun bir biçimde gösteriliyor.

Bir kullanıcıya veya gruba belirli bir klasör üzerinde tam denetim izni vermek için şu komutu çalıştırın:

Add-NTFSAccess -Path C:\docs -Account 'CORP\RShelby','BUILTIN\Administrators' -AccessRights 'Fullcontrol' -PassThru

İpucu. Varsayılan olarak, NTFSSecurity cmdlet'leri herhangi bir veri döndürmez. Komutun yürütüldükten sonra yeni ACL'leri görüntülemesini sağlamak için -PassThru parametresini kullanın.

İzinleri yalnızca en üst klasör düzeyinde vermek ve iç içe geçmiş nesnelerdeki (yalnızca klasör) izinleri değiştirmemek için şu komutu kullanın:

Add-NTFSAccess c:\docs\public -Account corp\LMurkowski -AccessRights Modify -AppliesTo ThisFolderOnly

Atanan NTFS izinlerini kaldırmak için:

Remove-NTFSAccess -Path C:\DOCS -Account 'corp\LMurkowski' -AccessRights FullControl -PassThru

Bir sonraki komut, verilen hesap için klasördeki tüm iç içe nesnelerin izinlerini kaldıracaktır (miras alınan izinler atlanacaktır):

Get-ChildItem -Path C:\docs -Recurse | Get-NTFSAccess -Account 'corp\LMurkowski' -ExcludeInherited |Remove-NTFSAccess -PassThru

Aşağıdaki komutla, Yönetici hesabını klasördeki tüm iç içe geçmiş nesnelerin sahibi yapabilirsiniz:

Get-ChildItem -Path C:\docs -Recurse -Force | Set-NTFSOwner -Account 'Administrator'

Klasör nesnelerine atanan tüm izinleri manuel olarak temizlemek için (miras alınan izinler kaldırılmaz):

Get-ChildItem -Path C:\docs -Recurse -Force | Clear-NTFSAccess

Bir klasördeki tüm nesneler için NTFS devralmasını etkinleştirmek için:

Get-ChildItem -Path C:\docs -Recurse -Force | Enable-NTFSAccessInheritance

Devralınanlar dışında manuel olarak atanan tüm izinleri görüntülemek için:

dir C:\docs | Get-NTFSAccess -ExcludeInherited

Belirli bir hesaba atanan izinleri görüntüleyebilirsiniz (bunu etkin izinlerle karıştırmayın, bunları daha sonra ele alacağız):

dir C:\docs | Get-NTFSAccess -Account a-d\RShelby

PowerShell ile NTFS Etkin İzinlerini Nasıl Görüntüleyebilirsiniz?

Belirli bir dosya veya klasör için etkili NTFS izinlerini görüntüleyebilirsiniz.

Get-EffectiveAccess

cmdlet. Birkaç AD güvenlik grubuna belirli bir klasöre erişim izni verdiğinizi ve belirli kullanıcı hesabının (veya SID'nin) dosyalar klasörüne erişip erişemeyeceğini bilmek istediğinizi varsayalım. Kullanıcı hesabının ait olduğu AD gruplarının tüm üyelerini listelemeden bunu nasıl yapabilirsiniz? Bu, etkin NTFS izinlerini görüntülemenin çok yararlı olduğu durumdur. Örneğin, confroom etki alanı hesabı için bir klasördeki tüm iç içe dizinlerdeki etkin izinleri görüntülemeniz gerekir.

Get-ChildItem -Path c:\docs -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'corp\confroom’ | select Account, AccessControlType, AccessRights, FullName

Veya belirli bir dosya için etkin izinleri görüntüleyebilirsiniz:

Get-Item -Path 'C:\docs\annual_report2019.xlsx' | Get-NTFSEffectiveAccess -Account 'corp\confroom' | Format-List

Dosya sistemi nesnesindeki geçerli etkin kullanıcı izinleri, AccessRights alanında belirtilir.

İlgili makaleler