İçeriğe atla
Sistem Günlüğü Teknik notlar ve Tecrübeler..
ACTIVE DIRECTORY 5 dk okuma

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

  1. Export (Raporlama):

    Sunucudaki belirli bir klasör altında bulunan birinci seviye klasörlerin NTFS izinlerini CSV dosyasına aktarır.
  2. 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?

  1. Scripti .ps1 dosyasına kaydedin.
  2. PowerShell’i Yönetici olarak açın.
  3. Scripti çalıştırın:
.\NTFS_Yetkileri_Script.ps1
  1. Menüden Export veya Apply seçimini yapın.
  2. 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.

Yorum yaz

Üye olmadan yorum yazabilirsin. Yorumlar onaylandıktan sonra yayınlanır.