Büyük ve uzun yıllardır aktif olan Active Directory ortamlarında zamanla yüzlerce hatta binlerce Group Policy Object (GPO) birikebilir. Bu GPO’lar çoğu zaman farklı ekipler tarafından farklı ihtiyaçlara göre ve farklı zamanlarda oluşturulmuştur. Sonuç olarak belirli bir ayarın hangi GPO içerisinde tanımlandığını bulmak sistem yöneticileri için ciddi bir zaman kaybına dönüşebilir.

Özellikle Internet Explorer (veya Microsoft Edge – IE Mode) tarafında kullanılan “Site to Zone Assignment List” ayarı buna iyi bir örnektir. Kurum içi uygulamalar kamu servisleri veya legacy web tabanlı sistemler için bazı domain’ler sıklıkla Trusted Sites (Güvenilen Siteler) bölgesine eklenir.

Ancak bu tanımlar çoğu zaman:

  • Farklı GPO’lara dağılmıştır
  • Dokümante edilmemiştir
  • Zamanla çakışan veya gereksiz kayıtlar içerebilir

Bir güvenlik denetimi, uygulama erişim problemi ya da hardening çalışması sırasında şu soruyla karşılaşmak kaçınılmazdır:

“*.turkiye.gov.tr domain’i hangi GPO üzerinden Trusted Sites olarak tanımlanmış?”

Bu makalemde PowerShell ve GPO raporlama yeteneklerini kullanarak bu soruya saniyeler içinde nasıl yanıt bulabileceğimizi adım adım inceleyeceğiz.

Problem Tanımı

Neden Geleneksel Yöntemler Yetersiz?

Group Policy Management Console (GPMC) üzerinden bir ayarı manuel olarak bulmak için genellikle şu adımlar izlenir:

  1. GPO açılır
  2. Settings sekmesine geçilir
  3. Show All seçilir
  4. Sayfa içerisinde ilgili ayar aranır

Bu yöntem:

  • 5–10 GPO için kabul edilebilir olsa da
  • 100+ GPO bulunan ortamlarda saatler sürebilir
  • İnsan hatasına açıktır
  • Otomasyon ve raporlama için uygun değildir

Bu noktada PowerShell hem hız hem de doğruluk açısından vazgeçilmez bir araç haline gelir.

PowerShell ile Otomatik GPO Taraması

Hazırlayacağımız script aşağıdaki mantıkla çalışır:

  1. Ortamdaki tüm GPO’ları listeler
  2. Her GPO için XML formatında detaylı bir rapor oluşturur
  3. Raporda “Site to Zone Assignment List” ayarının varlığını kontrol eder
  4. Ayar mevcutsa, hedef domain’in (örneğin *.turkiye.gov.tr) listede yer alıp almadığını tespit eder
  5. Sonuçları anlamlı ve okunabilir bir çıktı olarak ekrana basar

Bu yaklaşım sayesinde hem hedef domain’i hem de tarayıcı zone ayarlarını yöneten tüm GPO’ları net şekilde görebiliriz.

PowerShell Scripti

Aşağıdaki script, *.turkiye.gov.tr domain’ini hedef alarak tüm GPO’ları tarar.
İhtiyacınıza göre $TargetDomain değişkenini güncellemeniz yeterlidir.

# Aranacak Domain (Wildcard * kullanılabilir)
$TargetDomain = "*.turkiye.gov.tr"

# Ortamdaki tüm GPO'ları getir
$GPOs = Get-GPO -All

Write-Host "GPO Taraması Başlatılıyor... Lütfen bekleyiniz." -ForegroundColor Cyan

foreach ($GPO in $GPOs) {
    # GPO Raporunu XML formatında çek (Metin içi arama yapabilmek için)
    $Report = Get-GPOReport -Guid $GPO.Id -ReportType Xml
    
    # 1. Kontrol: GPO içinde 'Site to Zone Assignment List' ayarı var mı?
    if ($Report -match "Site to Zone Assignment List") {
        
        # 2. Kontrol: Ayar var, peki bizim aradığımız domain içeriyor mu?
        # regex::Escape, özel karakterlerin yanlış yorumlanmasını engeller
        if ($Report -match [regex]::Escape($TargetDomain)) {
            Write-Output "GPO: $($GPO.DisplayName) --> '$TargetDomain' içeriyor."
        } else {
            Write-Output "GPO: $($GPO.DisplayName) --> Site to Zone ayarı aktif ama '$TargetDomain' listede yok."
        }
    }
}

Write-Host "Tarama Tamamlandı." -ForegroundColor Cyan

Scriptin Teknik Analizi

Get-GPO vs Get-GPOReport

  • Get-GPO:
    Sadece GPO’nun temel metadatasını verir (Ad, GUID, oluşturulma tarihi).
  • Get-GPOReport -ReportType Xml:
    GPO içindeki tüm yapılandırmaları (Registry ayarları, Security Options, Script’ler vb.) XML formatında üretir.

Bu XML çıktı sayesinde GPO içeriği metin olarak analiz edilebilir.

-match Operatörü

PowerShell’in -match operatörü, Regex tabanlı metin araması yapar.
Bu sayede:

  • Büyük XML çıktıları içerisinde
  • Çok hızlı ve esnek aramalar yapılabilir

İlk -match, performans amacıyla yalnızca ilgili ayarı içeren GPO’ları süzer.
İkinci -match ise sadece bu GPO’lar üzerinde hedef domain kontrolünü yapar.

Neden [regex]::Escape Kullanıyoruz?

Domain isimleri genellikle:

  • Nokta (.)
  • Yıldız (*)

gibi Regex için özel anlamı olan karakterler içerir.
[regex]::Escape() kullanımı, bu karakterlerin literal (harfi harfine) değerlendirilmesini sağlar ve yanlış eşleşmeleri önler.

Çıktıların Yorumlanması

Script çalıştırıldığında iki temel çıktı tipi elde edilir:

Başarılı Eşleşme

GPO: Intranet-TrustedSites --> '*.turkiye.gov.tr' içeriyor.

Bu çıktı:

  • İlgili domain’in doğrudan bu GPO üzerinden Trusted Sites olarak tanımlandığını gösterir
  • Sorun giderme veya değişiklik için doğru GPO’yu işaret eder

Bilgilendirici Uyarı

GPO: Browser-Zone-Settings --> Site to Zone ayarı aktif ama '*.turkiye.gov.tr' listede yok.

Bu çıktı:

  • GPO’nun tarayıcı zone ayarlarını yönettiğini
  • Ancak aranan domain’i içermediğini gösterir

Bu bilgi, özellikle GPO envanteri çıkarma ve çakışma analizi için oldukça değerlidir.

Gereksinimler

Bu scriptin sorunsuz çalışabilmesi için:

  • Scriptin çalıştırıldığı sistemde RSAT (Remote Server Administration Tools) yüklü olmalıdır
  • Kullanıcının Active Directory üzerinde GPO Read yetkisine sahip olması yeterlidir
  • Domain Controller üzerinde çalıştırma zorunluluğu yoktur

Sonuç

PowerShell kullanarak GPO içeriklerini analiz etmek:

  • Zaman kazandırır
  • İnsan hatasını azaltır
  • Denetim ve troubleshooting süreçlerini ciddi şekilde kolaylaştırır

Bu yaklaşım yalnızca Trusted Sites için değil;
Registry tabanlı tüm GPO ayarlarının tespiti için genişletilebilir ve kurumsal ortamlarda standart bir araç haline getirilebilir.

İstersen bir sonraki adımda bu scripti:

  • CSV rapor üreten
  • OU bazlı filtreleme yapan
  • Sadece Computer/User Configuration ayırımı yapan

daha gelişmiş bir versiyona da dönüştürebiliriz.

İlginizi Çekebilir