PowerShell ile File Server ve NTFS Permission otomasyonu, klasör oluşturma, izin atama, departman klasörlerini standartlaştırma, kullanıcı home folder süreçleri ve ACL raporlama gibi tekrarlanan işlemleri daha kontrollü hale getirir.
Bu rehberde temel NTFS izin yapısını, PowerShell ile ACL okuma ve uygulama mantığını ve yaygın File Server otomasyon senaryolarını adım adım ele alıyorum.
Amaç ve Kapsam
Amaç, File Server üzerinde tekrar eden klasör ve yetki işlemlerini tek tek GUI üzerinden yapmak yerine standart PowerShell akışlarına dönüştürmektir. Örnekler departman klasörleri, kullanıcı home folder’ları ve ACL raporlama senaryolarına odaklanır.
Ön Koşullar
- NTFS izinlerini değiştirebilecek yetkili bir hesap
- PowerShell erişimi
- Hedef klasör yapısının ve kullanılacak güvenlik gruplarının önceden belirlenmesi
- Üretim ortamına geçmeden önce test klasöründe doğrulama yapılması
- Mevcut ACL yapısının değişiklik öncesinde raporlanması veya yedeklenmesi
NTFS Permission Yapısı
NTFS izinleri temel olarak şu başlıklarda değerlendirilir:
- Basic Permissions: Read, Write, Modify ve Full Control
- Advanced Permissions: Change Permissions, Take Ownership ve ayrıntılı nesne izinleri
- Inheritance: Üst klasörden alt klasörlere aktarılan izinler
PowerShell tarafında temel araçlar Get-Acl ve Set-Acl cmdlet’leridir.
Mevcut ACL Yapısını Görüntüleme
$path = 'D:DepartmanlarIT'
$acl = Get-Acl -Path $path
$acl.Access | Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited
Değişiklik yapmadan önce mevcut ACL’yi görmek, kalıtım ve mevcut yetkileri anlamak açısından önemlidir.
PowerShell ile Klasör Oluşturma ve NTFS İzin Atama
Aşağıdaki örnek yeni bir departman klasörü oluşturur ve üç farklı güvenlik grubuna farklı erişim seviyeleri tanımlar.
$path = 'D:DepartmanlarIT'
$groupFull = 'DOMAINIT-Full'
$groupModify = 'DOMAINIT-Modify'
$groupRead = 'DOMAINIT-Read'
if (-not (Test-Path $path)) {
New-Item -Path $path -ItemType Directory | Out-Null
}
$acl = Get-Acl -Path $path
$ruleFull = New-Object System.Security.AccessControl.FileSystemAccessRule(
$groupFull,
'FullControl',
'ContainerInherit,ObjectInherit',
'None',
'Allow'
)
$ruleModify = New-Object System.Security.AccessControl.FileSystemAccessRule(
$groupModify,
'Modify',
'ContainerInherit,ObjectInherit',
'None',
'Allow'
)
$ruleRead = New-Object System.Security.AccessControl.FileSystemAccessRule(
$groupRead,
'ReadAndExecute',
'ContainerInherit,ObjectInherit',
'None',
'Allow'
)
$acl.SetAccessRule($ruleFull)
$acl.SetAccessRule($ruleModify)
$acl.SetAccessRule($ruleRead)
Set-Acl -Path $path -AclObject $acl
Doğrulama
İzin uygulamasından sonra ACL’yi tekrar okuyarak beklenen grupların doğru izinlerle geldiğini kontrol edin:
Get-Acl -Path $path |
Select-Object -ExpandProperty Access |
Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited
Departman Klasörlerini Tek Script ile Oluşturma
Benzer klasör yapıları tekrar tekrar oluşturulacaksa departman listesi üzerinden standart bir döngü kurulabilir.
$basePath = 'D:Departmanlar'
$departments = @('IT', 'Finance', 'HR', 'Production')
foreach ($department in $departments) {
$folder = Join-Path $basePath $department
$group = "DOMAIN$department-Modify"
if (-not (Test-Path $folder)) {
New-Item -Path $folder -ItemType Directory | Out-Null
}
$acl = Get-Acl -Path $folder
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$group,
'Modify',
'ContainerInherit,ObjectInherit',
'None',
'Allow'
)
$acl.SetAccessRule($rule)
Set-Acl -Path $folder -AclObject $acl
}
Burada grup adlandırma standardının Active Directory tarafındaki gerçek grup yapınızla aynı olması gerekir.
Kullanıcı Home Folder Otomasyonu
Yeni bir kullanıcı için home folder oluşturma işlemi de aynı yaklaşımla otomatikleştirilebilir.
$user = 'user01'
$homeRoot = 'D:HomeFolders'
$homeDir = Join-Path $homeRoot $user
if (-not (Test-Path $homeDir)) {
New-Item -Path $homeDir -ItemType Directory | Out-Null
}
$acl = Get-Acl -Path $homeDir
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"DOMAIN$user",
'Modify',
'ContainerInherit,ObjectInherit',
'None',
'Allow'
)
$acl.SetAccessRule($rule)
Set-Acl -Path $homeDir -AclObject $acl
Bu örnek temel mantığı gösterir. Gerçek ortamda inheritance, yöneticilerin erişimi, sahiplik ve grup tabanlı yetkilendirme modeli ayrıca tasarlanmalıdır.
ACL Raporlama
Migration veya yetki analizi öncesinde klasörlerin ACL bilgilerini raporlamak yararlıdır.
$root = 'D:Departmanlar'
$reportPath = 'C:ACL_Reports'
$reportFile = Join-Path $reportPath "ACL_$(Get-Date -Format yyyyMMdd_HHmm).csv"
if (-not (Test-Path $reportPath)) {
New-Item -Path $reportPath -ItemType Directory -Force | Out-Null
}
$report = foreach ($folder in Get-ChildItem -Path $root -Directory) {
$acl = Get-Acl -Path $folder.FullName
foreach ($entry in $acl.Access) {
[PSCustomObject]@{
Folder = $folder.FullName
Identity = $entry.IdentityReference
Rights = $entry.FileSystemRights
Type = $entry.AccessControlType
IsInherited = $entry.IsInherited
InheritanceFlags = $entry.InheritanceFlags
PropagationFlags = $entry.PropagationFlags
}
}
}
$report | Export-Csv -Path $reportFile -NoTypeInformation -Encoding UTF8
Bu çıktı ACL yapısının denetlenmesi ve migration öncesi karşılaştırma için kullanılabilir. CSV raporu doğrudan bir ACL geri yükleme dosyası değildir; geri yükleme senaryosu ayrıca planlanmalıdır.
Troubleshooting
Access Denied Hatası
Script’i çalıştıran hesabın hedef klasör üzerinde izin değiştirme yetkisine sahip olduğunu kontrol edin. Gerekirse mevcut owner ve advanced permission yapısını inceleyin.
Grup Bulunamıyor
DOMAINGroupName biçimindeki güvenlik grubunun gerçekten var olduğunu ve yazımının doğru olduğunu doğrulayın.
Beklenmeyen Kalıtım Davranışı
ACL çıktısındaki IsInherited, InheritanceFlags ve PropagationFlags alanlarını kontrol edin. Üst klasörden gelen izinler, doğrudan atanan izinlerle birlikte değerlendirilmelidir.
Set-Acl Sonrası Beklenen Sonuç Oluşmuyor
Değişiklikten sonra Get-Acl ile gerçek sonucu yeniden okuyun. Script’te hedef klasör ve grup değişkenlerinin doğru olduğundan emin olun.
Güvenlik ve Best Practice
- Doğrudan kullanıcı yerine mümkün olduğunca güvenlik grupları üzerinden yetkilendirme yapın.
- Full Control yetkisini yalnızca gerçekten gerekli gruplara verin.
- Üretim klasörlerinde değişiklik öncesi mevcut ACL yapısını raporlayın.
- Inheritance davranışını bilinçli yönetin.
- Scriptleri önce test klasörü üzerinde doğrulayın.
- Gerçek domain, kullanıcı ve grup adlarını genel dokümantasyonlarda örnek değerlerle değiştirin.
Sonuç
PowerShell ile NTFS Permission otomasyonu, File Server yönetiminde tekrar eden işleri standartlaştırmak için güçlü bir yöntemdir. Klasör oluşturma, grup bazlı izin atama, home folder oluşturma ve ACL raporlama gibi işlemler tek bir yönetim yaklaşımı altında toplanabilir.
Asıl hedef yalnızca işlemi hızlandırmak değil; yetki modelini tekrar edilebilir, denetlenebilir ve daha az hataya açık hale getirmektir.
İlgili Rehberler
- NTFS Permission Tasarımı ve AGDLP Modeli
- PowerShell Komutları – Profesyonel Rehber
- PowerShell Windows Server Health Check ve Otomatik Raporlama
- PowerShell ile GPO Yönetimi
Microsoft Dokümantasyonu
File Server Tasarım Bağlantıları
PowerShell Operasyon Merkezi
Temel cmdlet, pipeline, filtreleme ve raporlama yaklaşımı için PowerShell Komutları ana referansına; hızlı hazır komutlar için Komut Kütüphanesi bölümüne geçebilirsiniz. Tekrarlanan işlemleri script haline getirirken PowerShell Script Nedir ve Nasıl Yazılır? rehberini kullanabilirsiniz.
