Site simgesi Baki ÇUBUK

Exchange Server SE DAG Ortamında Sağlık Kontrolü: HealthChecker.ps1 ile Uçtan Uca

Merhaba

Daha önce yayınladığım Exchange Server SE Sağlık Kontrolü: HealthChecker.ps1 ile Uçtan Uca yazısında, tek sunuculu bir ortamda HealthChecker.ps1 scriptinin nasıl indirileceğini ve çalıştırılacağını anlatmıştım. Bu yazıda ise aynı işlemi Database Availability Group (DAG) yapısında, iki node ve bir File Share Witness (FSW) üzerinde uçtan uca uyguluyoruz.

DAG ortamında sağlık kontrolü, tek sunucudaki adımların iki kez tekrarlanmasından ibaret değildir. İki nedenden dolayı farklıdır:

Bu yazının amacı tespit etmek ve anlamak. Raporda çıkan bulguları tek tek açıklıyor, hangisinin ne anlama geldiğini ve neden önemli olduğunu ele alıyoruz. Bulguların kapatılması ve Security Update kurulumu bir sonraki yazının konusu olacak.

Lab Topolojisi

Bu çalışmada kullandığım ortam aşağıdaki gibidir:

Sunucu Rol İşletim Sistemi Not
W25EXCNOD1 Exchange Server SE (Mailbox) Windows Server 2025 DAG üyesi, birinci node
W25EXCNOD2 Exchange Server SE (Mailbox) Windows Server 2025 DAG üyesi, ikinci node
W25WITNESS File Share Witness Windows Server 2025 Exchange kurulu değil, sadece tanık
EXCDAG Database Availability Group – IP-less DAG (Windows Server 2025)

DAG adı EXCDAG, witness sunucu W25WITNESS‘tir. Tanık dizini W25WITNESS üzerinde C:\DAGFileShareWitnesses\EXCDAG, bu dizini yayınlayan paylaşımın adı ise EXCDAG.bakicubuk.com‘dur. Dizin adı ile paylaşım adının farklı olması normaldir; yazının sonundaki witness kontrollerinde bu ayrım önem kazanacak.

Domain bakicubuk.com, AD Site Default-First-Site-Name, işletim sistemi her iki node’da Windows Server 2025 Datacenter (OS Build 26100.33296) ve Exchange sürümü Exchange SE RTM, build 15.02.2562.017.

Her node’da iki adapter var: Ethernet0 MAPI (istemci) ağı, Ethernet1 ise replikasyon ağı. Bu ayrım, raporu yorumlarken önemli olacak.

1. Adım: HealthChecker.ps1 Hazırlığı

Scripti her iki node üzerinde de değil, yönetim yapacağınız tek bir Node üzerinde çalıştırmak yeterlidir. HealthChecker uzak sunuculardan da veri toplayabilir. Ben W25EXCNOD1 üzerinden ilerliyorum.

Not: Scriptleri çalıştıracak hesabın Organization Management rol grubunda ve ilgili sunucularda Local Administrator olması gerekir. Exchange Management Shell’i Run as administrator (Yönetici olarak çalıştır) ile açın.

Çalışma dizini oluşturma

Öncelikle sunucuda bir çalışma klasörü oluşturalım (yoksa):

Windows PowerShell’i Run as administrator (Yönetici olarak çalıştır) ile açıp:

New-Item -Path "C:\Scripts" -ItemType Directory -Force

Scriptin son sürümünü indirme

Scripti doğrudan resmi GitHub sürümünden indirin (her zaman en güncel sürümü çeker):

Invoke-WebRequest -Uri "https://github.com/microsoft/CSS-Exchange/releases/latest/download/HealthChecker.ps1" -OutFile "C:\Scripts\HealthChecker.ps1"

Dosya engelini kaldırma

İndirilen dosya internetten geldiği için block işareti taşıyabilir. Çalıştırırken hata almamak adına engeli kaldırın:

Unblock-File -Path "C:\Scripts\HealthChecker.ps1"

Windows, internetten indirilen dosyalara güvenlik amacıyla Mark of the Web (MOTW) adı verilen bir işaret ekler. Bu işaret, dosyanın harici bir kaynaktan geldiğini belirtir ve PowerShell, imzalı olsa bile bu tür dosyaları çalıştırmadan önce ek güvenlik uyarısı verebilir ya da execution policy nedeniyle engelleyebilir. Unblock-File cmdlet’i bu işareti kaldırarak scriptin sorunsuz çalışmasını sağlar. Dosyanın kaynağına güvendiğinizden (bu örnekte Microsoft’un resmi GitHub deposundan indirildiğinden) emin olduğunuz için bu işaretlemeyi güvenle kaldırabilirsiniz.

İmza doğrulama

İnternetten indirilen bir scripti Exchange sunucusunda çalıştırmadan önce imzasını mutlaka doğrulayın. Status değeri Valid, imzalayan ise Microsoft Corporation olmalıdır.

Get-AuthenticodeSignature -FilePath "C:\Scripts\HealthChecker.ps1" | Select-Object Status, SignerCertificate | Format-List

Oturuma özel execution policy

İsterseniz oturumunuz için execution policy’yi geçici olarak esnetebilirsiniz (kalıcı değişiklik yapmadan):

Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned

PowerShell, imzasız veya harici scriptlerin çalıştırılmasını execution policy ile kontrol eder. Varsayılan olarak bir Windows Server’da bu politika Restricted veya RemoteSigned olabilir ve script çalıştırmayı engelleyebilir. Buradaki komutta önemli nokta -Scope Process parametresidir: bu, politikayı yalnızca o an açık olan PowerShell/EMS (Exchange Management Shell) oturumu için değiştirir. Oturumu kapattığınızda ayar otomatik olarak eski haline döner, yani sunucunun genel güvenlik politikasında kalıcı bir değişiklik yapmazsınız. RemoteSigned değeri ise yerel scriptlerin serbestçe, internetten inen scriptlerin ise yalnızca geçerli bir dijital imzaya sahipse çalışmasına izin verir. HealthChecker Microsoft imzalı olduğu için bu ayarla sorunsuz çalışır. Bu yaklaşım, sistem genelinde kalıcı bir politika gevşetmesi yapmadan işi güvenli biçimde halletmenizi sağlar.

Script sürümünü kontrol etme

cd C:\Scripts
.\HealthChecker.ps1 -ScriptUpdateOnly

Bu çalışmada kullandığım sürüm: Exchange Health Checker v26.08.11.1651

Not: Scripti çalıştıracak hesabın Organization Management rol grubunda ve her iki node üzerinde Local Administrator olması gerekir. Exchange Management Shell’i Run as administrator (Yönetici olarak çalıştır) ile açın. Uzak sunucudan veri toplarken WinRM ve WMI erişimi de açık olmalıdır.

Hangi Shell’de Çalıştırmalı?

Bu soru sık geliyor, o yüzden ayrı bir başlık açmakta fayda var. Microsoft’un dokümantasyonundaki ifade net: This script must be run as Administrator in Exchange Management Shell on an Exchange Server.

Script kendi içinde bir shell kontrolü yapıyor ve Exchange sunucusunda düz Windows PowerShell’den başlatıldığında Exchange ortamını yüklemeye çalışıyor. Çoğu zaman da başarılı oluyor. Ancak Get-ExchangeServer, Get-OwaVirtualDirectory gibi cmdlet’lere ulaşamadığı durumlarda raporu eksik veriyle üretiyor ve bunu her zaman açık bir hata olarak vermiyor. Eksik rapor, hatalı rapordan daha tehlikelidir.

Ayrım aslında basit: script hangi cmdlet’leri kullanıyor?

Cmdlet ailesi Örnek Gereken shell
Exchange cmdlet’leri Get-ExchangeServer, Test-ReplicationHealth, Set-ServerComponentState Exchange Management Shell
İşletim sistemi / ağ Get-NetAdapter, Get-CimInstance, registry işlemleri Yükseltilmiş Windows PowerShell yeterli
Failover Cluster Get-ClusterNode, Get-ClusterQuorum Yükseltilmiş PowerShell + FailoverClusters modülü
Active Directory Get-ADUser, Get-ADComputer Yükseltilmiş PowerShell + RSAT

EMS (Exchange Management Shell) zaten Windows PowerShell 5.1’in Exchange cmdlet’leri yüklenmiş hali, yani bir üst küme. Exchange sunucusunda yönetici olarak açılmış EMS (Exchange Management Shell) kullanmanın hiçbir dezavantajı yok; pratik kural bu.

Üç noktaya dikkat edin:

2. Adım: DAG Genelinde Sağlık Kontrolü

Tek sunucu yerine DAG’daki tüm Exchange sunucularını tek seferde taramak istiyoruz.

Her iki node için veri toplama:

cd C:\Scripts
.\HealthChecker.ps1 -Server "W25EXCNOD1"
.\HealthChecker.ps1 -Server "W25EXCNOD2"

Script her sunucu için bir TXT ve bir XML dosyası üretir; iki node’lu bu ortamda C:\Scripts klasöründe toplam dört dosya oluşur.

Alternatif: organizasyondaki tüm sunucuları otomatik tarama

Sunucu sayısı arttıkça tek tek yazmak yerine pipeline kullanmak daha pratiktir:

cd C:\Scripts
Get-ExchangeServer | Where-Object {$_.AdminDisplayVersion -Match "^Version 15"} | .\HealthChecker.ps1

Çıktılar bu yöntemde de aynıdır; yalnızca dosya adındaki zaman damgası değişir.

Sadece DAG üyelerini taramak isterseniz:

cd C:\Scripts
(Get-DatabaseAvailabilityGroup EXCDAG).Servers | ForEach-Object { .\HealthChecker.ps1 -Server $_.Name }

Çıktılar bu yöntemde de aynıdır; yalnızca dosya adındaki zaman damgası değişir.

Birleşik HTML raporu üretme

DAG’da HealthChecker‘ın asıl faydası burada ortaya çıkıyor. Toplanan XML dosyalarından tek bir karşılaştırmalı rapor üretiliyor ve iki node’un ayarları yan yana geliyor.

cd C:\Scripts
.\HealthChecker.ps1 -BuildHtmlServersReport -HtmlReportFile "EXCDAG-Report.html"
.\EXCDAG-Report.html
Önemli: -BuildHtmlServersReport parametresi yeni veri toplamaz; yalnızca çalışma klasöründe daha önce oluşturulmuş ...-HealthChecker-*.xml dosyalarını okuyup HTML’e dönüştürür. Bu yüzden raporu üretmeden önce sunucu için en az bir kez -Server parametresiyle scripti çalıştırıp XML çıktısı almış olmanız gerekir. Elde XML yoksa rapor boş çıkar veya hata alırsınız.
Çıktı dosyası adı
-HtmlReportFile parametresini vermezseniz script çıktıyı tarih-saat damgalı olarak ExchangeAllServersReport-yyyyMMddHHmmss.html biçiminde otomatik adlandırır. Dosyaya kendi vereceğiniz sade bir isim, özellikle raporları arşivlerken işinizi kolaylaştırır.

Yukarıdaki iki satırı tek seferde yapıştırırsanız önce .\HealthChecker.ps1 -BuildHtmlServersReport -HtmlReportFile "EXCDAG-Report.html komutunu çalışır. Bu satır tamamlandıktan sonra Enter tuşuna basarak .\EXCDAG-Report.html komutunun çalışmasını sağlayabilirsiniz.

Çıktı  EXCDAG-Report.html olarak oluşturulacaktır.

XML dosyalarını ayrı bir klasörde topluyorsanız:

cd C:\Scripts
.\HealthChecker.ps1 -BuildHtmlServersReport -XMLDirectoryPath "C:\Scripts\Reports" -HtmlReportFile "EXCDAG-Report.html"

Sık kullanılan parametreler

Parametre İşlevi Ne Zaman Kullanılır
-Server Belirtilen sunucudan veri toplar Tek node taramasında
-BuildHtmlServersReport XML’lerden birleşik HTML rapor üretir Veri toplama sonrası
-HtmlReportFile Rapor dosya adını belirler Rapor üretirken
-XMLDirectoryPath XML’lerin bulunduğu klasör Raporlar ayrı klasördeyse
-VulnerabilityReport Açık raporunu JSON olarak çıkarır Güncelleme planlarken
-AnalyzeDataOnly Mevcut XML’leri yeniden analiz eder Veri toplamadan tekrar bakarken
-MailboxReport Posta kutusu dağılım raporu üretir Kapasite planlamasında
-ScriptUpdateOnly Script sürümünü kontrol eder Çalıştırmadan önce

Açık (vulnerability) raporu

cd C:\Scripts
.\HealthChecker.ps1 -VulnerabilityReport

3. Adım: Raporu Okuma

HealthChecker çıktısı renk kodludur.

Renk Anlamı Aksiyon
Gri Bilgilendirme Aksiyon gerekmez
Yeşil Önerilerle uyumlu Aksiyon gerekmez
Sarı Uyarı Planlı bakımda düzeltin
Kırmızı Kritik En kısa sürede düzeltin

DAG ortamında raporu okurken üç şeye özellikle dikkat edin:

  1. Kırmızı satırların ikisinde de aynı olması. Bir node’da kırmızı, diğerinde yeşil olan bir madde varsa orada yapılandırma kayması var demektir.
  2. Donanım ve bellek farkları. İki node’un RAM, işlemci ve NIC yapılandırması aynı olmalıdır. Aksi halde failover sonrası performans düşer.
  3. Exchange build numaraları. İki node’un build numarası birbirinden farklıysa, güncelleme çalışmasına başlamadan önce bunu not edin.

Build numaralarını hızlıca karşılaştırmak için:

Get-ExchangeServer | Format-List Name,Edition,AdminDisplayVersion
Get-Command Exsetup.exe | ForEach-Object {$_.FileVersionInfo}

4. Adım: EXCDAG Raporunun Çıktısı

EXCDAG-Report.html dosyasını tarayıcıda açtığınızda, HealthChecker.ps1‘in her iki node için ürettiği raporu görürsünüz. Bu rapor Exchange Health Checker v26.09.08.1649 sürümüyle üretilmiştir; kendi ortamınızda farklı bir sürüm görüyorsanız script’i -ScriptUpdateOnly ile güncelleyip tekrar çalıştırmanız faydalı olur.

Servers Overview

Alan W25EXCNOD1 W25EXCNOD2
Exchange Version Exchange SE RTM Exchange SE RTM
Build 15.02.2562.017 15.02.2562.017
Server Role Mailbox Mailbox
Ürün Windows Server 2025 Datacenter Windows Server 2025 Datacenter
Time Zone Turkey Standard Time Turkey Standard Time
.NET Framework 4.8.1 4.8.1
Logical Cores 2 2
Physical Memory 32 GB 32 GB
Vulnerability Detected True True

İlk bakışta görülen şu: iki node birebir aynı. DAG açısından bu iyi haber, yapılandırma kayması yok. Kötü haber ise her iki node’da da güvenlik açığı tespit edilmiş olması.

Kırmızı Bulgular

Raporda dört kırmızı madde var ve dördü de her iki node’da aynı.

Bulgu Raporun Söylediği Neden Önemli
PageFile Otomatik yönetiliyor, boyut 0 MB. Önerilen: 8192 MB (32768 MB’ın %25’i) Bellek baskısı altında Exchange süreçleri beklenmedik şekilde sonlanabilir, store crash dump alınamaz
TCPKeepAlive Not Set. Değer yoksa KeepAliveTime varsayılan olarak 2 saat Firewall ve load balancer’lar bağlantıyı önce düşürür, Outlook istemcilerinde kopmalar görülür
Disable IPv6 Correctly IPv6 bazı NIC ayarlarında kapalı ama tam kapalı değil. DisabledComponents = 0 Exchange yarı devre dışı IPv6’yı desteklemez; DAG’da cluster iletişimi de IPv6 kullanır
Security Vulnerabilities 38 CVE listeleniyor (önceki raporda 29 idi) Sunucu, kapatılmamış açıklarla çalışıyor

Sarı Bulgular

Bulgu Raporun Söylediği Yorum
Not on the latest SU Son Security Update kurulu değil Build 15.02.2562.017; güncel sürüm SU9
Known Issue Detected Hibrit ortamda online archiving sorunu Sadece hibrit yapılandırmada geçerli
Visual C++ 2012 x64 Redistributable eski (11.0.50727) Her iki node’da da güncellenmeli
Sleepy NIC Disabled False, her iki adapter için Ağ kartı güç tasarrufu, gecikme ve kopma üretir
Common Services Not Running MSComplianceAudit durmuş (StartType: Automatic) Her iki node’da da aynı
AMSI Request Body Scanning False İstek gövdesi taraması kapalı görünüyor (CSS-Exchange tespit kısıtı, aşağıya bakınız)
Edition StandardEvaluation, yaklaşık 172 gün kaldı Süre dolduğunda Exchange servisleri durur

Onuncu maddeyi olduğu gibi kabul etmeyin. CSS-Exchange tarafında bilinen bir tespit hatası var: ortamda AmsiRequestBodyScanning için bir SettingOverride tanımlı değilse, HealthChecker değeri False olarak raporluyor. Oysa Ağustos 2025 güvenlik güncellemesinden itibaren bu özellik tüm protokoller için varsayılan olarak açık. Yani override yok durumu, raporda kapalı gibi görünüyor. Gerçek durumu şu komutla teyit edebilirsiniz:

Get-SettingOverride | Where-Object {$_.SectionName -eq "AmsiRequestBodyScanning"} | Format-List Name,ComponentName,SectionName,Parameters,Status

On birinci madde teknik bir hata gibi durmuyor ama lab’ın ömrünü belirleyen madde bu. Deneme süresi dolduğunda Exchange servisleri durur, bu yüzden bir kenara not etmekte fayda var.

İki Node Arasındaki Fark

Sunucu Visual C++ 2013 x64 durumu
W25EXCNOD1 Error — Unknown (paket bulunamıyor, öncelikli olarak ele alınmalı)
W25EXCNOD2 Kurulu ama eski sürümde (12.0.21005)

Uyumlu Alanlar

Rapor sadece sorunları göstermiyor. Aşağıdaki kalemler yeşil, yani öneriyle uyumlu:

Alan Durum
.NET Framework 4.8.1 (uyumlu)
Power Plan High performance
TLS 1.0 / 1.1 Disabled
TLS 1.2 / 1.3 Enabled
RSS Enabled True (her iki adapter)
Extended Protection Enabled (Any VDir)
SerializedDataSigning Enabled
Exchange Emergency Mitigation Service Enabled, pattern servisi erişilebilir
SMB1 Yüklü değil, engellenmiş
Auth Certificate Geçerli, sunucuda mevcut
Server Pending Reboot False (her iki node’da da)

Güvenlik Açıkları

Vulnerability bölümü build 15.02.2562.017 üzerinde açık olan 38 CVE listeliyor. Listenin ilk maddesi olan CVE-2021-1730 diğerlerinden ayrışıyor: bu açık bir Security Update ile değil, Download Domains yapılandırmasıyla kapatılıyor. Raporda Enable Download Domains = False olarak görünüyor. Diğer 37 CVE ise güncel SU (Security Update) kurulumuyla kapanacak; her birinin türünü (Elevation of Privilege, Spoofing, RCE vb.) MSRC danışma sayfalarından teyit ederek Kapanma Yöntemi sütununa ekledim, böylece tabloya bakan biri hangi CVE’nin ne tür bir risk taşıdığını da görebiliyor.

# CVE Kapanma Yöntemi
1 CVE-2021-1730 Download Domains yapılandırması
2 CVE-2025-25005 Security Update – Network Tampering Vulnerability
3 CVE-2025-25006 Security Update – Spoofing Vulnerability
4 CVE-2025-25007 Security Update – Spoofing Vulnerability
5 CVE-2025-33051 Security Update – Information Disclosure Vulnerability
6 CVE-2025-53782 Security Update – Elevation of Privilege Vulnerability
7 CVE-2025-59248 Security Update – Spoofing Vulnerability
8 CVE-2025-59249 Security Update – Elevation of Privilege Vulnerability
9 CVE-2025-64666 Security Update – Elevation of Privilege Vulnerability
10 CVE-2025-64667 Security Update – Spoofing Vulnerability
11 CVE-2026-21527 Security Update – Spoofing Vulnerability
12 CVE-2026-42897 Security Update – Spoofing Vulnerability (OWA)
13 CVE-2026-45500 Security Update – Cross-Site Scripting Vulnerability
14 CVE-2026-45501 Security Update – Cross-Site Scripting Vulnerability
15 CVE-2026-45502 Security Update – Server-Side Request Forgery Vulnerability
16 CVE-2026-45503 Security Update – Server-Side Request Forgery Vulnerability
17 CVE-2026-45504 Security Update – Elevation of Privilege Vulnerability
18 CVE-2026-47631 Security Update – Cross-Site Scripting Vulnerability
19 CVE-2026-55005 Security Update – Remote Code Execution Vulnerability
20 CVE-2026-55006 Security Update – Elevation of Privilege Vulnerability
21 CVE-2026-55007 Security Update – Remote Code Execution Vulnerability
22 CVE-2026-55008 Security Update – Spoofing Vulnerability
23 CVE-2026-55009 Security Update – Elevation of Privilege Vulnerability
24 CVE-2026-62910 Security Update – Elevation of Privilege Vulnerability
25 CVE-2026-62911 Security Update – Elevation of Privilege Vulnerability
26 CVE-2026-62912 Security Update – Denial of Service Vulnerability
27 CVE-2026-62913 Security Update – Remote Code Execution Vulnerability
28 CVE-2026-62914 Security Update – Spoofing Vulnerability
29 CVE-2026-62915 Security Update – Security Feature Bypass Vulnerability
30 CVE-2026-65813 Security Update – Server-Side Request Forgery Vulnerability
31 CVE-2026-69355 Security Update – Remote Code Execution Vulnerability
32 CVE-2026-69356 Security Update – Spoofing Vulnerability
33 CVE-2026-69361 Security Update – Spoofing Vulnerability
34 CVE-2026-69375 Security Update – Tampering Vulnerability
35 CVE-2026-69378 Security Update – Denial of Service Vulnerability
36 CVE-2026-69380 Security Update – Elevation of Privilege Vulnerability
37 CVE-2026-69382 Security Update – Information Disclosure Vulnerability
38 CVE-2026-69641 Security Update – Elevation of Privilege Vulnerability

Her bir CVE’nin ayrıntısı EXCDAG-Report.html içindeki bağlantılardan (MSRC advisory) incelenebilir.

EXCDAG-Report.html dosyasını açarak detaylı kontrol edebilirsiniz.

W25EXCNOD1 isimli sunucumuz üzerindeki bulgular

W25EXCNOD2 isimli sunucumuz üzerindeki bulgular

Her bir CVE’nin ayrıntısı EXCDAG-Report.html içindeki bağlantılardan (MSRC advisory) incelenebilir; yazıda tek tek açıklamak yerine sayıyı ve kapanma yöntemini vermek daha okunur oluyor.

Raporun Göstermediği Bir Ayrıntı

HealthChecker bu tür bir ayrıntıyı bulgu olarak işaretlemez; ağ bölümünü satır satır okumak gerekir. Replikasyon ağı (Ethernet1, 192.168.2.x) DAG’da yalnızca node’lar arası veritabanı replikasyonu için kullanılır; bu arayüzün DNS’e kayıtlı olmaması ve üzerinde bir DNS sunucusu tanımlı olmaması önerilir. Aksi halde istemciler MAPI trafiğini yanlışlıkla replikasyon ağına yönlendirmeye çalışabilir.

Kendi ortamınızda bu ayrıntıyı kontrol etmek için:

Get-DnsClient | Select-Object InterfaceAlias, RegisterThisConnectionsAddress
Get-DatabaseAvailabilityGroupNetwork -Identity EXCDAG | Format-List Name,Subnets,ReplicationEnabled,MapiAccessEnabled

Get-DnsClient çıktısındaki RegisterThisConnectionsAddress = True değeri her adapter için görünse de bu sadece kayıt denenir mi ayarıdır; adapterde DNS sunucusu tanımlı değilse fiilen kayıt oluşmaz. Asıl teyit HealthChecker raporundaki Registered In DNS alanıdır.

Eğer replikasyon arayüzünde bu alan True görünüyorsa veya arayüzde bir DNS sunucusu tanımlıysa, adaptörün ağ ayarlarından (veya Set-DnsClient -InterfaceAlias "Ethernet1" -RegisterThisConnectionsAddress $false komutuyla) kaydı kapatıp DNS sunucu adresini boşaltmanız gerekir.

Bu ortamda yaptığım kontrolün sonucu: her iki node’da da Ethernet1 için Registered In DNS = False ve DNS Server alanı boş, yani replikasyon arayüzü doğru yapılandırılmış. MAPI/istemci ağı olan Ethernet0 ise beklendiği gibi DNS’e kayıtlı.

5. Adım: DAG’a Özel Sağlık Kontrolleri

HealthChecker‘ın kapsamadığı, DAG’a özel kontroller aşağıdadır. Her birinin beklenen değeri tabloda verilmiştir.

Kontrol Komut Beklenen Değer
DAG yapılandırması Get-DatabaseAvailabilityGroup Tüm sunucular OperationalServers listesinde
Replikasyon sağlığı Test-ReplicationHealth Tüm testler Passed
Kopya durumu Get-MailboxDatabaseCopyStatus Healthy / Mounted
Kopya kuyrukları CopyQueueLength / ReplayQueueLength 0
İndeks durumu ContentIndexState Healthy veya NotApplicable
Cluster node durumu Get-ClusterNode Her iki node Up
Quorum yapılandırması Get-ClusterQuorum Node and File Share Majority
Witness durumu Get-ClusterResource State: Online
Not: Exchange Server SE’de arama altyapısı BigFunnel’a taşındığı için Get-MailboxDatabaseCopyStatus çıktısında ContentIndexState değeri NotApplicable görünür. Ayrı bir içerik indeksi (Search Foundation katalogu) kullanılmadığından kontrol edilecek bir durum da kalmamıştır; bu yüzden NotApplicable beklenen sonuçtur, bir arıza değildir. Healthy değerini yalnızca Exchange 2016 ve 2019 ortamlarında görürsünüz.

DAG yapılandırması ve witness durumu

Get-DatabaseAvailabilityGroup EXCDAG -Status | Format-List Name,Servers,WitnessServer,WitnessDirectory,PrimaryActiveManager,OperationalServers

OperationalServers alanında her iki node da görünmelidir. Bir node eksikse, o node cluster’dan düşmüş demektir.

Replikasyon sağlığı

Test-ReplicationHealth -Identity W25EXCNOD1
Test-ReplicationHealth -Identity W25EXCNOD2

W25EXCNOD1 isimli sunucumuz üzerindeki çıktı:

W25EXCNOD2 isimli sunucumuz üzerindeki çıktı:

Sadece başarısız olanları görmek için:

Test-ReplicationHealth -Identity W25EXCNOD1 | Where-Object {$_.Result.ToString() -ne "Passed"}
Test-ReplicationHealth -Identity W25EXCNOD2 | Where-Object {$_.Result.ToString() -ne "Passed"}
Not: Buradaki .ToString() şarttır. Result alanı düz metin değil bir enum değeri tuttuğu için doğrudan "Passed" ile karşılaştırıldığında filtre hiçbir satırı elemez ve komut, sadece başarısızları göster dense de bütün testleri listeler. Doğru yazımıyla, her şey yolundaysa komut hiçbir çıktı üretmez, boş çıktı burada iyi haberdir.

Veritabanı kopya durumu

Get-MailboxDatabaseCopyStatus * | Format-Table Name,Status,CopyQueueLength,ReplayQueueLength,ContentIndexState -AutoSize
Not: Exchange SE’de ContentIndexState değeri NotApplicable döner ve bu normaldir. Exchange 2019 CU12 ile gelen BigFunnel mimarisinde arama indeksi ayrı bir katalogda değil, veritabanının kendi içinde tutulur. Eski sürümlerden gelen alışkanlıkla burada Healthy aramayın.

Aktif kopyaların hangi node’da olduğunu görmek için:

Get-MailboxDatabaseCopyStatus * | Where-Object {$_.Status -eq "Mounted"} | Format-Table Name,MailboxServer,ActiveCopy -AutoSize

Bu çıktı, bir sonraki yazıda hangi node’dan başlayacağımızı belirleyecek: güncelleme her zaman pasif node’dan başlar.

Cluster ve Quorum durumu

Get-ClusterNode
Get-ClusterQuorum | Format-List *
Get-ClusterResource

İki node’lu bir DAG’da Quorum modeli Node and File Share Majority olmalı ve witness kaynağı Online görünmelidir.

Ekran görüntünüzdeki QuorumType alanı Majority olarak görünüyor, NodeAndFileShareMajority değil. Bunun nedeni bir yapılandırma sorunu değil; Microsoft, FailoverClusters modülünde QuorumType alanını zaman içinde sadeleştirdi. Eskiden NodeMajority, NodeAndDiskMajority, NodeAndFileShareMajority gibi detaylı değerler dönerken, güncel sürümlerde (Windows Server 2025 dahil) hepsi tek bir genel Majority değeri olarak raporlanıyor. Witness’ın gerçek türü artık QuorumType alanında değil, QuorumResource alanında görünüyor.

Önerilen düzeltme:

İki node ve bir File Share Witness’tan oluşan bu yapıda beklenen değer NodeAndFileShareMajority’dir. Ancak güncel Windows Server sürümlerinde Get-ClusterQuorum‘un QuorumType alanı bu detaylı ismi değil, sadeleştirilmiş Majority değerini döner; bu bir yapılandırma sorunu değildir. Witness’ın gerçek türünü görmek için asıl bakılması gereken alan QuorumResource‘dur, örneğimizde bu alan File Share Witness (\\w25witness.bakicubuk.com\EXCDAG.bakicubuk.com) olarak doğru şekilde görünüyor. Detaylı quorum türünü illa görmek isterseniz Failover Cluster Manager’da cluster adına sağ tıklayıp More Actions > Configure Cluster Quorum Settings sihirbazını açabilir (ayarı değiştirmeden iptal edebilirsiniz) veya şu komutu çalıştırabilirsiniz:
Get-CimInstance -Namespace root\MSCluster -ClassName MSCluster_ClusterConfiguration | Select-Object QuorumType

File Share Witness erişilebilirliği

Get-ClusterResource | Where-Object {$_.ResourceType -eq "File Share Witness"} |
    Format-List Name,State,OwnerNode

Not: Witness’ın sağlıklı olup olmadığını Test-Path ile ölçmeyin. File Share Witness paylaşımının erişim izinleri yalnızca cluster ad nesnesine (<DAGAdı>$ bilgisayar hesabı) verilir; bu yüzden yönetici hesabıyla çalıştırılanTest-Path, witness çalışır durumdayken bile False döner. Ayrıca WitnessDirectory değeri diskteki klasörü (C:\DAGFileShareWitnesses\EXCDAG) gösterirken paylaşımın adı EXCDAG.bakicubuk.com‘dur; klasör adından paylaşım yolu türetmek de yanlış sonuç verir. Doğru gösterge cluster kaynağının kendi durumudur: State değeri Online ise witness erişilebilir demektir.

Genel sunucu sağlığı

Get-ServerHealth -Identity W25EXCNOD1 | Where-Object {$_.AlertValue -ne "Healthy"}
Get-ServerHealth -Identity W25EXCNOD2 | Where-Object {$_.AlertValue -ne "Healthy"}

Bu komut, durumu Healthy olmayan tüm monitör tanımlarını listelediği için çıktı ilk bakışta uzun ve ürkütücü görünür. Satırlara bakarken State sütununa dikkat edin: değeri NotApplicable ise o monitör henüz hiç veri toplamamış demektir, yani gerçek bir alarm değildir. Unknown değeri de aynı şekilde ölçüm yok anlamına gelir. Gerçekten müdahale gerektiren durumları ayırt etmek için sadece AlertValue‘ya değil, State sütununa da birlikte bakmak daha güvenilir bir yöntemdir.



Sağlık Kontrolü Kontrol Listesi

# Kontrol Beklenen Sonuç
1 HealthChecker script sürümü güncel En son sürüm
2 Script imzası doğrulandı Valid / Microsoft Corporation
3 Her iki node için veri toplandı 2 XML + 2 TXT
4 Birleşik HTML rapor üretildi Karşılaştırmalı çıktı
5 Kırmızı bulgular listelendi 4 kalem tespit edildi
6 Sarı bulgular listelendi 7 kalem tespit edildi
7 İki node karşılaştırıldı Tek fark: Visual C++ 2013 durumu
8 Test-ReplicationHealth temiz Passed (tüm testler)
9 Quorum ve witness sağlıklı Online
10 Vulnerability raporu alındı 38 CVE listelendi

Düzenli Sağlık Kontrolü

Sağlık kontrolünü sadece güncelleme öncesinde değil, düzenli aralıklarla da yapmanızı öneririm. Aşağıdaki komutla haftalık çalışan bir zamanlanmış görev oluşturabilirsiniz.

Burada dikkat edilmesi gereken bir nokta var: HealthChecker.ps1 Exchange Management Shell ister. Zamanlanmış görev düz PowerShell.exe ile başlatıldığında Exchange cmdlet’leri yüklü olmaz ve rapor eksik veriyle üretilir. Bu yüzden görevin komutunda önce Exchange ortamını yüklüyoruz:

$cmd = ". 'C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1'; " +
       "Connect-ExchangeServer -auto; " +
       "C:\Scripts\HealthChecker.ps1 -Server W25EXCNOD1,W25EXCNOD2"

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
  -Argument "-NonInteractive -ExecutionPolicy Bypass -Command `"$cmd`"" `
  -WorkingDirectory "C:\Scripts"

$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 06:00

Register-ScheduledTask -TaskName "Exchange HealthChecker - EXCDAG" `
  -Action $action -Trigger $trigger -RunLevel Highest -User "BAKICUBUK\svc-healthchecker" -Password "********"
Not: Görevin çalışacağı hesabın Organization Management rol grubunda ve sunucularda Local Administrator olması gerekir. SYSTEM hesabı bu yetkilere sahip olmadığı için burada işe yaramaz; bu amaçla oluşturulmuş bir servis hesabı kullanın. Görevi bir kez elle çalıştırıp C:\Scripts altında XML ve TXT dosyalarının oluştuğunu doğrulayın.

Sonuç

EXCDAG ortamında yaptığımız sağlık kontrolü, 4 Kırmızı ve 7 Sarı bulgu ortaya çıkardı. İki node’un yapılandırması neredeyse birebir aynı olduğu için yapılandırma kayması yok; tek fark W25EXCNOD1‘de Visual C++ 2013 x64 paketinin bulunamaması (W25EXCNOD2‘de ise sadece eski bir sürümde kurulu olması).

DAG ortamında HealthChecker.ps1, iki node arasındaki farkları tek bir raporda görmenizi sağlıyor. Ancak scriptin kapsamı sunucu düzeyinde kalıyor; replikasyon sağlığı, Quorum ve Witness durumu gibi DAG’a özel konuları ayrıca kontrol etmeniz gerekiyor. Bir de scriptin renklendirmediği satırlara bakmakta fayda var; replikasyon NIC’inin DNS kaydı buna iyi bir örnek.

Bir sonraki yazıda bu bulguları sırayla kapatacağız: hangi düzeltmenin restart gerektirdiği, hangilerinin organizasyon genelinde bir kez uygulandığı, node’ların hangi sırayla bakıma alınacağı ve son olarak SU10 (KB5121608) kurulumu.


Başka bir yazımızda görüşmek dileğiyle…

Mobil sürümden çık