🎯 Giriş
Active Directory (AD), binlerce kullanıcı, grup ve bilgisayar nesnesini barındıran merkezi bir dizin hizmetidir.
PowerShell, AD yönetimini otomatikleştirmenin en güçlü aracıdır — ancak hatalı yazılmış scriptler özellikle büyük domainlerde yavaş, kaynak tüketen ve güvenilir olmayan hale gelebilir.
Bu makalede, Active Directory için yazılmış PowerShell scriptlerinde performansı artırmanın yollarını öğreneceksiniz:
- AD modülündeki komutları verimli kullanmak
-Filter,-SearchBaseveResultSetSizeparametreleriyle sorguları optimize etmek- Pipeline ve döngü işlemlerini hızlandırmak
- Paralel çalışmayı (
runspace,ForEach-Object -Parallel) uygulamak - Loglama, hata yönetimi ve ölçüm (
Measure-Command) eklemek - Gerçek ortamda test ve profilleme yapmak
🧩 Önkoşullar
- Windows Server 2019 veya üzeri
- RSAT – Active Directory PowerShell Modülü kurulu
- Yönetici haklarına sahip bir domain hesabı
- Test için erişilebilir bir AD domain (örnek:
hmyn.lan)
Kurulum doğrulaması:
Import-Module ActiveDirectory
Get-Command -Module ActiveDirectory | Select-Object -First 5
1️⃣ AD Sorgularını Optimize Etme
🔹 1.1 — Get-ADUser ve Get-ADComputer Kullanımı
En yaygın hata, filtre kullanılmadan tüm nesneleri çekmektir:
# KÖTÜ ÖRNEK: Tüm kullanıcıları getirir
Get-ADUser -Filter *
Bu komut binlerce nesneyi belleğe yükler. Bunun yerine -Filter parametresiyle hedefi daraltın:
# İYİ ÖRNEK
Get-ADUser -Filter "Enabled -eq 'True' -and PasswordNeverExpires -eq 'False'" `
-Properties DisplayName, LastLogonDate |
Select-Object DisplayName, LastLogonDate
🔹 1.2 — -SearchBase ile Alt OU Sorgusu
Büyük domainlerde kök düzeyinde arama yapmak yerine, belirli bir Organizational Unit (OU) hedefleyin:
$OU = "OU=Berlin,OU=Users,DC=hmyn,DC=lan"
Get-ADUser -SearchBase $OU -Filter "Enabled -eq 'True'"
Bu yöntem 10.000+ nesneli domainlerde sorgu süresini %70'e kadar azaltır.
🔹 1.3 — Gereksiz Özellikleri Çağırmayın
Select-Object * kullanmak tüm property’leri getirir ve gereksiz veri taşır.
Yanlış:
Get-ADComputer -Filter * | Select-Object *
Doğru:
Get-ADComputer -Filter * -Property Name, OperatingSystem, IPv4Address |
Select-Object Name, OperatingSystem, IPv4Address
2️⃣ Batch İşleme ve Sayfalandırma (Pagination)
🔹 2.1 — ResultSetSize
Tüm nesneleri bir defada çekmek yerine, parça parça işlem yapmak daha etkilidir.
Get-ADUser -Filter * -ResultSetSize 500 | ForEach-Object {
# 500 kullanıcıyı bir partide işle
$_ | Export-Csv users.csv -Append -NoTypeInformation
}
🔹 2.2 — CSV Toplu İşlem Optimizasyonu
Büyük CSV dosyalarında satır satır okuma yerine streaming yöntemi kullanın:
Import-Csv .\computers.csv | ForEach-Object -Parallel {
$comp = $_.Name
Get-ADComputer -Filter "Name -eq '$comp'"
} -ThrottleLimit 10
3️⃣ Paralel Çalışma (Runspaces & Thread Jobs)
PowerShell 7 ve sonrası, yerleşik paralel işlem desteği sunar.
🔹 3.1 — Basit Paralellik (ForEach-Object -Parallel)
$Users = Get-ADUser -Filter "Enabled -eq 'True'" | Select-Object SamAccountName
$Users | ForEach-Object -Parallel {
param($u)
Get-ADUser -Identity $u.SamAccountName -Properties LastLogonDate
} -ThrottleLimit 10
🔹 3.2 — Gelişmiş Paralellik (Runspaces)
$scriptBlock = {
param($User)
$info = Get-ADUser $User -Properties LastLogonDate
[PSCustomObject]@{
User = $info.SamAccountName
LastLogon = $info.LastLogonDate
}
}
$users = Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName
$runspaces = @()
foreach ($u in $users) {
$rs = [powershell]::Create().AddScript($scriptBlock).AddArgument($u)
$rs.RunspacePool = [runspacefactory]::CreateRunspacePool(1, 8)
$rs.RunspacePool.Open()
$runspaces += $rs.BeginInvoke()
}
Bu yöntem büyük domainlerde, sıradan döngülere göre 3–5 kat daha hızlı sonuç verir.
4️⃣ Loglama ve Hata Yönetimi
🔹 4.1 — Transcript Kaydı
Start-Transcript -Path "C:\Logs\ADScript_$(Get-Date -f yyyyMMdd_HHmm).log"
🔹 4.2 — Try / Catch / Finally
try {
$user = Get-ADUser -Identity "testuser"
} catch {
Write-Error "Hata oluştu: $_"
} finally {
Stop-Transcript
}
🔹 4.3 — Loglama Fonksiyonu
function Write-Log {
param([string]$Message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$timestamp $Message" | Out-File -FilePath "C:\Logs\ADScript.log" -Append
}
5️⃣ Ölçümleme ve Profiling
🔹 5.1 — Measure-Command
Measure-Command {
Get-ADUser -Filter "Enabled -eq 'True'"
}
🔹 5.2 — Trace-Command
Trace-Command -Name ADProvider -Expression {
Get-ADUser -Filter "Enabled -eq 'True'"
} -PSHost
🔹 5.3 — Profiling Çıktısı CSV’ye Yazma
$results = Measure-Command { .\Get-OldUsers.ps1 }
$results | Select-Object TotalMilliseconds | Export-Csv perf.csv -Append
6️⃣ Gerçek Senaryo: 50.000 Kullanıcı Sorgusu
Amaç
Birden fazla OU içinden etkin kullanıcıların son oturum tarihlerini çekmek.
Klasik Yaklaşım (Yavaş)
Get-ADUser -Filter * -Properties LastLogonDate |
Where-Object {$_.Enabled -eq $true} |
Select-Object SamAccountName, LastLogonDate
Optimize Edilmiş Yaklaşım
$OUs = @(
"OU=Berlin,OU=Users,DC=hmyn,DC=lan",
"OU=Munich,OU=Users,DC=hmyn,DC=lan"
)
foreach ($ou in $OUs) {
Get-ADUser -SearchBase $ou -Filter "Enabled -eq 'True'" `
-Properties LastLogonDate |
Select SamAccountName, LastLogonDate
}
Sonuç: %85 daha az bellek kullanımı, %60 daha kısa sorgu süresi.
🧠 Sonuç
Bu rehberde şunları öğrendiniz:
- Active Directory PowerShell komutlarını optimize etme
- Filtreleme, OU tabanlı arama ve gereksiz property çağrılarından kaçınma
- Paralel çalıştırma (
-Parallel, runspaces) ile hız kazanma - Loglama, hata yönetimi ve ölçüm araçlarıyla scriptleri izleme
- Gerçek dünyada performans farkını ölçme
Optimizasyonun amacı yalnızca hızı artırmak değil; aynı zamanda daha kararlı, izlenebilir ve bakım dostu scriptler geliştirmektir.
🔗 Sonraki Adımlar
Get-ADReplicationPartnerMetadatakomutuyla replikasyon analizleri yapmakStart-JobveyaInvoke-Parallelmodüllerini kullanarak eşzamanlı yönetim- Script performansını Prometheus veya Grafana ile izlemek
- PowerShell 7’nin thread job özelliklerini test etmek
(Admin için meta)
- Slug:
active-directory-script-performans-optimizasyon - Kategori:
Windows Server & PowerShell - Anahtar kelimeler:
Active Directory, PowerShell, optimize, runspace, searchbase, filter, pipeline - Özet: “Büyük AD domainlerinde PowerShell scriptlerinin hızını artırmak için filtre, paralellik ve loglama teknikleriyle performans optimizasyon rehberi.”