Test-ADReplicationHealth
Remove-LingeringObjects
Get-ADReplicationPerformance
Get-TombstoneLifetime
Active Directory Replikasyon İçin Kullanılacak Scriptler
- Test-ADReplicationHealth
- Remove-LingeringObjects
- Get-ADReplicationPerformance
- Get-TombstoneLifetime
# 1. Replikasyon Sağlık Kontrolü ve Raporlama function Test-ADReplicationHealth { param ( $LogPath = "C:\Logs\ADReplication", $EmailTo = "admin@domain.com", $WarningThreshold = 45 # minutes ) Begin { # Log klasörü oluştur if (-not (Test-Path $LogPath)) { New-Item -ItemType Directory -Path $LogPath } $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm" $logFile = Join-Path $LogPath "ADReplication_$timestamp.log" $htmlReport = Join-Path $LogPath "ADReplication_$timestamp.html" # HTML rapor başlığı $htmlHeader = @" <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid black; padding: 8px; text-align: left; } th { background-color: #4CAF50; color: white; } tr:nth-child(even) { background-color: #f2f2f2; } .critical { background-color: #ff9999; } .warning { background-color: #ffeb99; } </style> "@ } Process { try { # Tüm Domain Controller'ları al $DCs = Get-ADDomainController -Filter * $results = @() foreach ($DC in $DCs) { Write-Verbose "Checking replication status for $($DC.HostName)" # Replikasyon durumunu kontrol et $replStatus = repadmin /showrepl $DC.HostName /csv | ConvertFrom-Csv # DC'nin erişilebilirliğini kontrol et $pingStatus = Test-Connection -ComputerName $DC.HostName -Count 1 -Quiet # DC servisleri kontrol et $services = @("NTDS", "DNS", "Netlogon", "W32Time") $serviceStatus = @{} foreach ($service in $services) { try { $status = Get-Service -ComputerName $DC.HostName -Name $service -ErrorAction Stop $serviceStatus = $status.Status } catch { $serviceStatus = "Error" } } # Son replikasyon zamanını al $lastRepl = ($replStatus | Where-Object { $_.SourceDSA -ne $DC.HostName } | Measure-Object "Last Success Time" -Maximum).Maximum $results += @{ DomainC Site = $DC.Site IP = $DC.IPv4Address Online = $pingStatus LastReplication = $lastRepl NTDSStatus = $serviceStatus DNSStatus = $serviceStatus NetlogonStatus = $serviceStatus TimeStatus = $serviceStatus FailureCount = ($replStatus | Where-Object { $_."Number of Failures" -gt 0 }).Count } # Log dosyasına yaz "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): Checked $($DC.HostName)" | Out-File $logFile -Append } # HTML raporu oluştur $htmlBody = $results | ConvertTo-Html -Head $htmlHeader -PreContent "<h1>AD Replication Status Report</h1><h3>Generated: $(Get-Date)</h3>" $htmlBody | Out-File $htmlReport # Kritik durumları kontrol et ve email gönder $criticalIssues = $results | Where-Object { -not $_.Online -or $_.FailureCount -gt 0 -or $_.NTDSStatus -ne "Running" } if ($criticalIssues) { $emailBody = "Critical AD Replication Issues Detected:`n`n" $emailBody += $criticalIssues | Format-Table | Out-String Send-MailMessage -To $EmailTo ` -Subject "AD Replication Alert: Critical Issues Detected" ` -Body $emailBody ` -BodyAsHtml ` -Attachments $htmlReport } return $results } catch { Write-Error "Error occurred: $_" "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): ERROR - $_" | Out-File $logFile -Append } } } # 2. Lingering Object Tespit ve Temizleme function Remove-LingeringObjects { param ( $SourceDC, $TargetDC, $Advisory, $LogPath = "C:\Logs\LingeringObjects" ) Begin { if (-not (Test-Path $LogPath)) { New-Item -ItemType Directory -Path $LogPath } $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm" $logFile = Join-Path $LogPath "LingeringObjects_$timestamp.log" } Process { try { # DC'lerin erişilebilirliğini kontrol et $sourcePing = Test-Connection -ComputerName $SourceDC -Count 1 -Quiet $targetPing = Test-Connection -ComputerName $TargetDC -Count 1 -Quiet if (-not ($sourcePing -and $targetPing)) { throw "One or both DCs are not reachable" } # Target DC'nin GUID'ini al $targetDCObj = Get-ADDomainController $TargetDC $targetGuid = $targetDCObj.ObjectGUID # Naming Context'leri al $namingC -Server $SourceDC).namingContexts foreach ($nc in $namingContexts) { "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): Processing $nc" | Out-File $logFile -Append if ($Advisory) { # Advisory mode - sadece raporla $cmd = "repadmin /removelingeringobjects $SourceDC $targetGuid `"$nc`" /ADVISORY_MODE" $result = Invoke-Expression $cmd $result | Out-File $logFile -Append } else { # Gerçek temizlik if ($PSCmdlet.ShouldProcess($nc, "Remove lingering objects")) { $cmd = "repadmin /removelingeringobjects $SourceDC $targetGuid `"$nc`"" $result = Invoke-Expression $cmd $result | Out-File $logFile -Append } } } # Sonuçları raporla Get-Content $logFile } catch { Write-Error "Error occurred: $_" "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): ERROR - $_" | Out-File $logFile -Append } } } # 3. Replikasyon Performans İzleme function Get-ADReplicationPerformance { param ( $SampleInterval = 5, # seconds $SampleCount = 12, $LogPath = "C:\Logs\ADPerformance" ) Begin { if (-not (Test-Path $LogPath)) { New-Item -ItemType Directory -Path $LogPath } $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm" $logFile = Join-Path $LogPath "ADPerformance_$timestamp.csv" $counters = @( "\DirectoryServices\DS Directory Reads/sec", "\DirectoryServices\DS Directory Writes/sec", "\DirectoryServices\LDAP Client Sessions", "\DirectoryServices\LDAP Bind Time", "\DirectoryServices\DRA Pending Replication Operations", "\DirectoryServices\DRA Pending Replication Synchronizations" ) } Process { try { $results = Get-Counter -Counter $counters -SampleInterval $SampleInterval -MaxSamples $SampleCount | Select-Object -ExpandProperty CounterSamples | Select-Object Path, CookedValue, TimeStamp # CSV'ye kaydet $results | Export-Csv -Path $logFile -NoTypeInformation # Özet istatistikler hesapla $summary = $results | Group-Object Path | ForEach-Object { $values = $_.Group.CookedValue @{ Counter = $_.Name Average = ($values | Measure-Object -Average).Average Maximum = ($values | Measure-Object -Maximum).Maximum Minimum = ($values | Measure-Object -Minimum).Minimum Samples = $values.Count } } return $summary } catch { Write-Error "Error occurred: $_" } } } # 4. Tombstone Lifetime İzleme function Get-TombstoneLifetime { param ( $WarningThreshold = 45, # days $EmailTo = "admin@domain.com" ) Process { try { # Forest yapılandırmasını al $forest = Get-ADForest $rootDomain = $forest.RootDomain # Tombstone Lifetime değerini al $searchBase = "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,$((Get-ADDomain $rootDomain).DistinguishedName)" $tombst -SearchBase $searchBase -Filter {objectClass -eq "dSHeuristics"} -Properties tombstoneLifetime $result = @{ ForestName = $forest.Name Tombst ($tombstoneLifetime.tombstoneLifetime) { $tombstoneLifetime.tombstoneLifetime } else { 60 # default value } Status = "OK" LastChecked = Get-Date } # Warning kontrolü if ($result.TombstoneLifetime -lt $WarningThreshold) { $result.Status = "Warning" # Email uyarısı gönder $emailBody = @" Warning: Tombstone Lifetime is set to $($result.TombstoneLifetime) days. Recommended minimum is $WarningThreshold days. Forest: $($result.ForestName) Checked: $($result.LastChecked) "@ Send-MailMessage -To $EmailTo ` -Subject "AD Tombstone Lifetime Warning" ` -Body $emailBody } return $result } catch { Write-Error "Error occurred: $_" } } } # Kullanım örnekleri: # 1. Replikasyon sağlık kontrolü # Test-ADReplicationHealth -Verbose # 2. Lingering object temizliği (Advisory mode) # Remove-LingeringObjects -SourceDC "DC1" -TargetDC "DC2" -Advisory # 3. Performans izleme # Get-ADReplicationPerformance -SampleInterval 10 -SampleCount 6 # 4. Tombstone lifetime kontrolü # Get-TombstoneLifetime -WarningThreshold 50 ``` Bu PowerShell scriptleri şunları içerir: 1. **Test-ADReplicationHealth** - Tüm DC'lerin replikasyon durumunu kontrol eder - HTML ve log dosyası oluşturur - Kritik durumlarda email atar - Servis durumlarını kontrol eder 2. **Remove-LingeringObjects** - Lingering object tespiti ve temizliği yapar - Advisory mode desteği - Detaylı loglama - Her naming context için ayrı işlem 3. **Get-ADReplicationPerformance** - Performans sayaçlarını izler - CSV formatında kayıt tutar - Özet istatistikler oluşturur - Çoklu performans metriği desteği 4. **Get-TombstoneLifetime** - Tombstone lifetime değerini kontrol eder - Warning threshold kontrolü - Email uyarı sistemi - Forest genelinde kontrol Her script: - Detaylı hata yakalama - Loglama - Email bildirimleri - Parametrik yapılandırma özelliklerine sahiptir. Bu scriptleri kullanarak: 1. Günlük replikasyon kontrolü 2. Haftalık performans raporu 3. Aylık tombstone kontrolü 4. Gerektiğinde lingering object temizliği