PowerShell ile NTFS Yetki Raporlama ve Otomatik Grup Yetkilendirme
Bu doküman, bir dosya sunucusunda NTFS izinlerini PowerShell ile raporlamak ve grup isimlerini topluca güncellemek için kullanılabilir.
Örneğin \fileservershare altındaki 1.seviye tüm klasörlerin yetkilerini çıkarır burada DOMAIN\EskiGrup yerine DOMAIN\YeniGrup yaparak eski grubun yetkilerinin aynısını yeni gruba da tanımlar.
İş Akışı Özeti
- Export (Raporlama):
Sunucudaki belirli bir klasör altında bulunan birinci seviye klasörlerin NTFS izinlerini CSV dosyasına aktarır. - Apply (Yetki Ekleme):
Oluşan CSV dosyasındaki belirli bir grup ismini topluca başka bir grup ismine çevirerek aynı izinleri tekrar uygular.
Her iki işlem sonunda, işlemi başarıyla tamamlanan ve hata alınan klasörler için sade ve görsel bir çıktı sunar, detaylar log dosyasına yazılır.
Kullanım Senaryosu
Bu script ile, örneğin DOMAINESKI_GRUP yetkilerine sahip tüm klasörlere aynı hakları DOMAINYENI_GRUP olarak hızlıca ekleyebilirsiniz.
Böylece grup değişikliklerinde manuel işlem ihtiyacı ortadan kalkar.
Script’in Anonimleştirilmiş Son Hali
param (
[ValidateSet("Export", "Apply")]
[string]$Mode = ""
)
# ============================================================
# NTFS Yetki Domain Geçiş Scripti
# Amaç: Eski domain gruplarinin yetkilerini, ayni isimli
# yeni domain gruplarina kopyalamak (ek olarak verir,
# eski yetkileri SILMEZ).
# ============================================================
$basePath = "D:DosyaSunucuKlasorler" # Yetkilerin okunacagi/uygulanacagi ana dizin
$oldDomain = "ESKIDOMAIN" # Eski domain (NetBIOS adi, orn: CONTOSO)
$newDomain = "YENIDOMAIN" # Yeni domain (NetBIOS adi, orn: FABRIKAM)
$csvFile = ".NTFS_Yetkileri.csv" # Raporlama / yedek dosyasi
$logFile = ".NTFS_Islem_Log.txt" # Apply islem logu
$failLog = ".NTFS_Failures.log" # Hatali klasor logu
function Export-NTFSPermissions {
Write-Host "`n[EXPORT MODU] NTFS yetkileri CSV'ye aktariliyor..." -ForegroundColor Cyan
$folders = Get-ChildItem -Path $basePath -Directory -ErrorAction SilentlyContinue
$result = @()
$failures = @()
foreach ($folder in $folders) {
$acl = Get-Acl -LiteralPath $folder.FullName -ErrorAction SilentlyContinue
if ($acl) {
foreach ($ace in $acl.Access) {
$result += [PSCustomObject]@{
Folder = $folder.FullName
Group = $ace.IdentityReference.Value
Rights = $ace.FileSystemRights
AccessType = $ace.AccessControlType
Inheritance = $ace.InheritanceFlags
Propagation = $ace.PropagationFlags
IsInherited = $ace.IsInherited
}
}
} else {
$failures += "$($folder.FullName) - Get-Acl hatasi veya erisim yok!"
}
}
$result | Export-Csv -Path $csvFile -NoTypeInformation -Encoding UTF8
Write-Host "[OK] CSV olusturuldu: $csvFile (toplam $($result.Count) kayit)" -ForegroundColor Green
if ($failures.Count -gt 0) {
$failures | Out-File -Encoding UTF8 $failLog
Write-Host "[!] Bazi klasorler islenemedi, detaylar $failLog dosyasinda." -ForegroundColor Yellow
} else {
Write-Host "[OK] Tum klasorler basariyla islendi." -ForegroundColor Green
}
}
function Apply-NewGroupPermissions {
Write-Host "`n[APPLY MODU] CSV'den yeni domain grup yetkileri ekleniyor..." -ForegroundColor Cyan
Write-Host " $oldDomain => $newDomain" -ForegroundColor DarkCyan
if (-not (Test-Path $csvFile)) {
Write-Host "[HATA] $csvFile bulunamadi. Once Export calistirin." -ForegroundColor Red
return
}
$data = Import-Csv $csvFile
$log = @()
$countOk = 0
$countFail = 0
$countSkip = 0
foreach ($row in $data) {
# 1) Sadece eski domaine ait ACE'leri ele al
if ($row.Group -notlike "$oldDomain*") { continue }
# 2) Devralinan (inherited) yetkileri kopyalama; bunlar ust klasorden gelir.
# Sadece klasore DOGRUDAN atanmis yetkiler tasinir.
# (Devralinanlari da istiyorsaniz asagidaki 2 satiri yorum satiri yapin.)
if ($row.IsInherited -eq "True") {
$countSkip++
continue
}
# 3) Domaini degistir, grup adini koru: ESKIDOMAINFinans => YENIDOMAINFinans
$groupName = $row.Group.Substring($row.Group.IndexOf('') + 1)
$newGroup = "$newDomain$groupName"
$folder = $row.Folder
$acl = Get-Acl -LiteralPath $folder -ErrorAction SilentlyContinue
if (-not $acl) {
$countFail++
$log += "[HATA] $newGroup => $folder : Get-Acl hatasi veya erisim yok!"
continue
}
try {
# Orijinal yetkileri birebir koru (Rights / Inheritance / Propagation / AccessType)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$newGroup,
[System.Security.AccessControl.FileSystemRights] $row.Rights,
[System.Security.AccessControl.InheritanceFlags] $row.Inheritance,
[System.Security.AccessControl.PropagationFlags] $row.Propagation,
[System.Security.AccessControl.AccessControlType] $row.AccessType
)
$acl.AddAccessRule($rule)
Set-Acl -LiteralPath $folder -AclObject $acl -ErrorAction Stop
$countOk++
Write-Host ("[OK] {0} => {1}" -f $newGroup, $folder) -ForegroundColor Green
$log += "[EKLENDI] $newGroup ($($row.Rights)) => $folder"
}
catch {
$countFail++
Write-Host ("[HATA] {0} => {1}" -f $newGroup, $folder) -ForegroundColor Red
$log += "[HATA] $newGroup => $folder : $($_.Exception.Message)"
}
}
Write-Host ("`nEKLENEN: {0} | Hatali: {1} | Atlanan(devralinan): {2}" -f $countOk, $countFail, $countSkip) -ForegroundColor Yellow
$log | Out-File $logFile -Encoding UTF8
Write-Host "[OK] Log dosyasi: $logFile" -ForegroundColor Green
}
# ---------------- Ana Menu ----------------
Write-Host "----------------------------------" -ForegroundColor Blue
Write-Host " NTFS Domain Gecis Scripti v2.0 " -ForegroundColor Blue
Write-Host "----------------------------------" -ForegroundColor Blue
Write-Host "1- Export : Mevcut NTFS yetkilerini CSV'ye al (ayni zamanda yedek)" -ForegroundColor White
Write-Host "2- Apply : $oldDomain gruplarini $newDomain gruplari olarak ekle" -ForegroundColor White
Write-Host "----------------------------------" -ForegroundColor Blue
if ($Mode -eq "") {
$secim = Read-Host "Seciminizi girin (Export/Apply)"
} else {
$secim = $Mode
}
Write-Host "Secim: $secim" -ForegroundColor Yellow
switch ($secim) {
"Export" { Export-NTFSPermissions }
"Apply" { Apply-NewGroupPermissions }
default { Write-Host "Gecersiz secim!" -ForegroundColor Red }
}
Nasıl Kullanılır?
- Scripti .ps1 dosyasına kaydedin.
- PowerShell’i Yönetici olarak açın.
- Scripti çalıştırın:
.\NTFS_Yetkileri_Script.ps1
- Menüden Export veya Apply seçimini yapın.
- Sonuçlar ekrana sade ve renkli olarak gelir, detaylar log dosyasındadır.
Notlar
- Script, sadece birinci seviye alt klasörlerde çalışır.
- Yetki hataları ya da bulunmayan klasörler ekrana yazılmaz, loga kaydedilir.
- Grup isimleri ve dosya yolları örnektir, kendi ortamınıza göre değiştiriniz.
- Gerekirse scriptte, filtreleme veya farklı grup adları için düzenleme yapabilirsiniz.
Örnek Ekran Çıktısı
--------------------------
NTFS Yetki Scripti v1.x
--------------------------
1- NTFS Yetkilerini CSV'ye aktar (Export)
2- CSV'deki eski grup yetkilerini yeni grup olarak uygula (Apply)
--------------------------
Seçiminizi girin (Export/Apply): Export
Seçim: Export
[EXPORT MODU] NTFS yetkileri CSV'ye aktarılıyor...
[✓] CSV oluşturuldu: .NTFS_Yetkileri.csv
[!] Bazı klasörler işlenemedi, detaylar .NTFS_Failures.log dosyasında.
Sonuç
Bu script ile dosya sunucusunda NTFS izin raporlama ve toplu grup yetki ekleme işlemlerini hızlı, güvenli ve sade bir şekilde otomatikleştirebilirsiniz.