# Active Directory Yetki Denetimi: Domain Admin ve Kritik Grup Değişikliklerini Anlık İzleyen PowerShell Scripti

- Bağlantı: https://musti.org/powershell/ad-yetki-denetimi-domain-admin-izleme-scripti/
- Yayımlanma: 2026-09-21T21:38:33+03:00
- Yazar: mmutlu

Domain Admins grubuna kimin ne zaman eklendiğini şu an, bakmadan söyleyebilir misiniz?
Çoğu ekip bu soruya net bir cevap veremiyor — çünkü grup üyeliği değişiklikleri 
genellikle sadece “bir şey ters gittiğinde” geriye dönük olarak inceleniyor. Oysa
yetkisiz veya fark edilmeyen bir ekleme, kurumsal güvenlik açısından en kritik risklerden
biri ve bunu manuel kontrol yerine otomatik izlemek saldırı yüzeyini ciddi şekilde
daraltıyor.

## Kritik Grupların Mevcut Üyelerini Alma

    ```
    $kritikGruplar = @("Domain Admins", "Enterprise Admins", "Schema Admins", "Backup Operators")

    foreach ($grup in $kritikGruplar) {
        Write-Host "`n=== $grup ===" -ForegroundColor Cyan
        Get-ADGroupMember -Identity $grup | Select-Object Name, SamAccountName
    }
    ```

## Değişiklik Tespiti: Anlık Snapshot Karşılaştırması

Bir değişikliğin “yeni mi eski mi” olduğunu anlamak için önceki durumu bir dosyada
saklayıp her çalıştırmada karşılaştırmak işe yarıyor:

    ```
    $grup = "Domain Admins"
    $onceki = if (Test-Path "C:\Durum\domain_admins_onceki.json") {
        Get-Content "C:\Durum\domain_admins_onceki.json" | ConvertFrom-Json
    } else { @() }

    $guncel = Get-ADGroupMember -Identity $grup | Select-Object -ExpandProperty SamAccountName

    $yeniEklenen = Compare-Object -ReferenceObject $onceki -DifferenceObject $guncel |
        Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject

    if ($yeniEklenen) {
        $mesaj = "UYARI: $grup grubuna yeni üye(ler) eklendi: $($yeniEklenen -join ', ')"
        Send-MailMessage -From "guvenlik-uyari@sirket.com" -To "mmutlu@sirket.com" `
            -Subject "GÜVENLİK UYARISI: $grup Değişikliği" -Body $mesaj -SmtpServer "smtp.sirket.com" -Priority High
    }

    $guncel | ConvertTo-Json | Set-Content "C:\Durum\domain_admins_onceki.json"
    ```

## Daha Gerçek Zamanlı Çözüm: Event Log Tabanlı İzleme

Snapshot karşılaştırması periyodik çalışırken (örneğin 15 dakikada bir), gerçek 
zamanlı bildirim isteyenler için Security Event Log’daki **Event ID 4728** (bir 
kullanıcı güvenlik grubuna eklendi) olayını izlemek daha hızlı sonuç veriyor:

    ```
    Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4728} -MaxEvents 10 |
        Where-Object {$_.Message -match "Domain Admins"} |
        Select-Object TimeCreated, Message
    ```

## Zamanlanmış Görev ile Sürekli İzleme

    ```
    $tetikleyici = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration ([TimeSpan]::MaxValue)
    $eylem = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scriptler\YetkiDenetimi.ps1"
    Register-ScheduledTask -TaskName "KritikGrupIzleme" -Trigger $tetikleyici -Action $eylem -RunLevel Highest
    ```

## Bu Yeterli mi?

Hayır, tek başına değil. Bu tür izleme scriptleri değerli bir **tespit** katmanı
ama asıl güçlü savunma [PAM (Ayrıcalıklı Erişim Yönetimi)](https://musti.org/category/pam-yonetimi/)
ile kalıcı yönetici yetkilerini baştan ortadan kaldırmaktan geçiyor. İzleme scriptlerini,
PAM gibi önleyici kontrollerin yanında ikinci bir güvenlik katmanı olarak düşünmek
gerekiyor — biri sorunu önlüyor, diğeri önlenemeyeni yakalıyor. İkisi birlikte, 
bir saldırganın veya yanlışlıkla yapılan bir değişikliğin fark edilme süresini saatlerden
dakikalara indiriyor.
