Merhaba
Bir önceki yazı olan Exchange Server SE DAG Ortamında Sağlık Kontrolü: HealthChecker.ps1 ile Uçtan Uca yazısında, iki node ve bir File Share Witness’tan oluşan EXCDAG ortamında HealthChecker.ps1 ile uçtan uca sağlık kontrolü yapmış, çıkan raporu satır satır yorumlamıştık. Sonuç 4 Kırmızı ve 7 Sarı bulgu bulgu olmuştu.
Bu yazıda o bulguları sırayla kapatıyoruz. Tek sunuculu bir ortamda bu işlem, komutları çalıştırıp sunucuyu yeniden başlatmaktan ibarettir. DAG yapısında ise üç soruyu önceden cevaplamanız gerekir:
- Hangi düzeltme nerede uygulanır? Bazı ayarlar organizasyon genelindedir ve bir kez uygulanır; bazıları sunucu bazlıdır ve her iki node’da ayrı ayrı yapılmalıdır.
- Hangi düzeltme restart gerektirir? Restart gerektiren maddeleri tek bir yeniden başlatmada toplamak, kesinti sayısını ikiye indirir.
- Node’lar hangi sırayla bakıma alınır? Aktif veritabanı kopyalarını barındıran node her zaman en sona bırakılır.
Bu üç soruya göre çalışmayı fazlara böldük. Aşağıdaki adımları uyguladığınızda kullanıcı tarafında hissedilen kesinti, yalnızca switchover anıyla sınırlı kalacak.
Raporun Künyesi
| Alan | Değer |
|---|---|
| Rapor | Exchange Health Checker v26.09.08.1649 |
| Tarih | 11.09.2026 |
| Kapsam | W25EXCNOD1.bakicubuk.com, W25EXCNOD2.bakicubuk.com |
| DAG | EXCDAG (2 node + File Share Witness) |
| Build | 15.02.2562.017 (Exchange SE RTM), her iki node aynı |
İki node’un yapılandırması neredeyse birebir aynı. Bu iyi haber: DAG’da yapılandırma kayması (configuration drift) yok. Tek fark, Visual C++ 2013 x64 paketinin durumu: W25EXCNOD1‘de paket hiç bulunamıyor, W25EXCNOD2‘de ise sadece eski bir sürümde kurulu.
| Alan | Durum |
|---|---|
| Kırmızı bulgu | 4 kalem (her iki node’da aynı) |
| Sarı bulgu | 7 kalem (her iki node’da aynı) |
| Node’lar arası fark | Sadece Visual C++ 2013 x64 durumu |
| Yeşil (sorun yok) | .NET 4.8.1, High Performance güç planı, TLS 1.2/1.3, RSS, Extended Protection, SerializedDataSigning, EEMS, SMB1 kapalı, Server Pending Reboot (her iki node’da False) |
Bulgu Envanteri
| # | Bulgu | Seviye | NOD1 | NOD2 | Restart |
|---|---|---|---|---|---|
| 1 | PageFile otomatik yönetiliyor (0 MB) | Kırmızı | Var | Var | Evet |
| 2 | TCPKeepAlive ayarlanmamış | Kırmızı | Var | Var | Evet |
| 3 | IPv6 tam olarak devre dışı değil | Kırmızı | Var | Var | Evet |
| 4 | Security Vulnerabilities (38 CVE) | Kırmızı | Var | Var | Evet |
| 5 | Son SU kurulu değil | Sarı | Var | Var | Evet |
| 6 | Known Issue: hybrid online archiving | Sarı | Var | Var | – |
| 7 | Visual C++ 2012 x64 eski (11.0.50727) | Sarı | Var | Var | Olası |
| 8 | Sleepy NIC (2 adapter) | Sarı | Var | Var | Hayır |
| 9 | Common Services Not Running (MSComplianceAudit) | Sarı | Var | Var | Hayır |
| 10 | AMSI Request Body Scanning kapalı | Sarı | Var | Var | Hayır |
| 11 | Edition: StandardEvaluation (~172 gün) | Sarı | Var | Var | Hayır |
| 12 | Visual C++ 2013 x64 node farkı | Sarı | Kurulu değil | Eski sürüm | Olası |
| 13 | Enable Download Domains = False | Bilgi | Var | Var | Hayır |
Bu Planda Kapsam Dışı
4 numaralı madde (CVE listesi) ve 5 numaralı madde (son SU) bir sonraki çalışmanın konusu. Rapordaki 38 CVE‘den 37‘si SU10 (KB5121608) kurulumuyla birlikte kapanacak. Kalan tek CVE olan CVE-2021-1730 ise SU’yu beklemiyor; bu planın A4 maddesinde ele alınan Download Domains yapılandırmasıyla kapanıyor, o yüzden aşağıdaki listede yer almıyor. Bu plandaki düzeltmeler SU kurulumundan önce yapılır, çünkü HealthChecker‘ın işaret ettiği yapılandırma hataları güncelleme sırasında da sorun çıkarabilir.
Raporda listelenen ve SU10‘u bekleyen 37 CVE, build 15.02.2562.017 üzerinde açık durumda:
| # | CVE | Kapanma Yöntemi |
|---|---|---|
| 1 | CVE-2025-25005 | Security Update – Network Tampering Vulnerability |
| 2 | CVE-2025-25006 | Security Update – Spoofing Vulnerability |
| 3 | CVE-2025-25007 | Security Update – Spoofing Vulnerability |
| 4 | CVE-2025-33051 | Security Update – Information Disclosure Vulnerability |
| 5 | CVE-2025-53782 | Security Update – Elevation of Privilege Vulnerability |
| 6 | CVE-2025-59248 | Security Update – Spoofing Vulnerability |
| 7 | CVE-2025-59249 | Security Update – Elevation of Privilege Vulnerability |
| 8 | CVE-2025-64666 | Security Update – Elevation of Privilege Vulnerability |
| 9 | CVE-2025-64667 | Security Update – Spoofing Vulnerability |
| 10 | CVE-2026-21527 | Security Update – Spoofing Vulnerability |
| 11 | CVE-2026-42897 | Security Update – Spoofing Vulnerability (OWA) |
| 12 | CVE-2026-45500 | Security Update – Cross-Site Scripting Vulnerability |
| 13 | CVE-2026-45501 | Security Update – Cross-Site Scripting Vulnerability |
| 14 | CVE-2026-45502 | Security Update – Server-Side Request Forgery Vulnerability |
| 15 | CVE-2026-45503 | Security Update – Server-Side Request Forgery Vulnerability |
| 16 | CVE-2026-45504 | Security Update – Elevation of Privilege Vulnerability |
| 17 | CVE-2026-47631 | Security Update – Cross-Site Scripting Vulnerability |
| 18 | CVE-2026-55005 | Security Update – Remote Code Execution Vulnerability |
| 19 | CVE-2026-55006 | Security Update – Elevation of Privilege Vulnerability |
| 20 | CVE-2026-55007 | Security Update – Remote Code Execution Vulnerability |
| 21 | CVE-2026-55008 | Security Update – Spoofing Vulnerability |
| 22 | CVE-2026-55009 | Security Update – Elevation of Privilege Vulnerability |
| 23 | CVE-2026-62910 | Security Update – Elevation of Privilege Vulnerability |
| 24 | CVE-2026-62911 | Security Update – Elevation of Privilege Vulnerability |
| 25 | CVE-2026-62912 | Security Update – Denial of Service Vulnerability |
| 26 | CVE-2026-62913 | Security Update – Remote Code Execution Vulnerability |
| 27 | CVE-2026-62914 | Security Update – Spoofing Vulnerability |
| 28 | CVE-2026-62915 | Security Update – Security Feature Bypass Vulnerability |
| 29 | CVE-2026-65813 | Security Update – Server-Side Request Forgery Vulnerability |
| 30 | CVE-2026-69355 | Security Update – Remote Code Execution Vulnerability |
| 31 | CVE-2026-69356 | Security Update – Spoofing Vulnerability |
| 32 | CVE-2026-69361 | Security Update – Spoofing Vulnerability |
| 33 | CVE-2026-69375 | Security Update – Tampering Vulnerability |
| 34 | CVE-2026-69378 | Security Update – Denial of Service Vulnerability |
| 35 | CVE-2026-69380 | Security Update – Elevation of Privilege Vulnerability |
| 36 | CVE-2026-69382 | Security Update – Information Disclosure Vulnerability |
| 37 | 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.
Uygulama Sırası
Düzeltmeleri üç fazda uygulayacağız. Restart gerektiren maddeler tek bir restart’ta toplanıyor, böylece her node bir kez yeniden başlatılıyor.
| Faz | Kapsam | Nerede Çalıştırılır |
|---|---|---|
| Faz 0 | Ön kontrol | Herhangi bir node |
| Faz A | Tek shell’den uygulanacak düzeltmeler | Bir node’dan, -Server / -Identity ile |
| Faz B | Sunucu bazlı düzeltmeler + restart | Önce pasif node, sonra aktif node |
| Faz C | Doğrulama ve raporu tazeleme | Herhangi bir node |
Faz 0: Ön Kontrol
Hiçbir değişiklik yapmadan önce DAG’ın sağlıklı olduğunu doğrulayın.
Get-DatabaseAvailabilityGroup EXCDAG -Status | Format-List Name,Servers,WitnessServer,PrimaryActiveManager,OperationalServers
Test-ReplicationHealth -Identity W25EXCNOD1
Test-ReplicationHealth -Identity W25EXCNOD2
Get-MailboxDatabaseCopyStatus * | Format-Table Name,Status,CopyQueueLength,ReplayQueueLength,ContentIndexState -AutoSize
Get-ClusterNode
Get-ClusterQuorum




Aktif kopyaların hangi node’da olduğunu not edin; Faz B’de pasif node’dan başlayacağız.
Get-ClusterQuorum çıktısındaki QuorumType alanı güncel FailoverClusters modülünde sadeleştirilmiş Majority değerini döndürebilir, NodeAndFileShareMajority gibi detaylı bir isim değil. Bu bir yapılandırma sorunu değildir; witness’ın gerçek türü QuorumResource alanında görünür. Ayrıntısını bir önceki yazıda ele almıştım.Yukarıdaki komut bloğunun tamamının çıktısı: Get-DatabaseAvailabilityGroup, her iki node için Test-ReplicationHealth, Get-MailboxDatabaseCopyStatus, Get-ClusterNode ve Get-ClusterQuorum. Beklenen: Test-ReplicationHealth her iki node’da da tüm kontrollerde Passed, kopyalar Mounted/Healthy ve kuyruklar (CopyQueueLength, ReplayQueueLength) 0, Get-ClusterNode her iki node için Up, Get-ClusterQuorum çıktısında QuorumResource alanı File Share Witness olarak görünmeli. Tek bir Failed satırı varken bile düzeltmelere başlamayın; node bakıma alındığında o veritabanı için tek sağlıklı kopya kalmaz.
Get-MailboxDatabaseCopyStatus * | Where-Object {$_.Status -eq "Mounted"} | Format-Table Name,MailboxServer -AutoSize

Faz A: Tek Shell’den Uygulanacak Düzeltmeler
Bu fazdaki maddeler için sunuculara tek tek bağlanmanıza gerek yok, hepsi tek bir Exchange Management Shell oturumundan yapılabilir.
Ancak kapsamları farklı:
| Madde | Kapsam | Uygulama |
|---|---|---|
| A1. Sertifika | Sunucu bazlı (doğrulama) | Her node için ayrı komut (-Server ile) |
| A2. AMSI Body Scanning | Organizasyon geneli + sunucu bazlı devreye alma | Override tek komut, refresh ve IIS restart her node’da |
| A3. Lisans anahtarı | Sunucu bazlı | Her node için ayrı komut (-Identity ile) |
| A4. Download Domains | Karma: DNS tek kayıt, sertifika sunucu bazlı, ayar tek komut | Bkz. A4 tablosu |
A1. Sertifika Durumu (Kontrol)
Sertifikalar Exchange’de sunucu bazlıdır; her node kendi yerel sertifika deposunu kullanır. HealthChecker raporlarında zaman zaman bir sertifika isteğinin PendingRequest durumunda takılı kaldığı görülür. Tipik sebebi, bir node üzerinde New-ExchangeCertificate -GenerateRequest çalıştırılıp üretilen CSR’ın hiç tamamlanmamasıdır. Ortak namespace kullanan bir DAG’da böyle bir isteğin genelde karşılığı yoktur, çünkü namespace zaten ortak bir SAN sertifikası üzerinden çalışır ve yarıda kalan istek yalnızca raporu kirletir.
Ortamınızda böyle bir kayıt olup olmadığını kontrol edin:
"W25EXCNOD1","W25EXCNOD2" | ForEach-Object {
Write-Host "`n=== $_ ===" -ForegroundColor Cyan
Get-ExchangeCertificate -Server $_ | Format-Table Thumbprint,Status,NotAfter,Services,Subject -AutoSize
}

Sadece bekleyen istekleri süzün:
"W25EXCNOD1","W25EXCNOD2" | ForEach-Object {
$srv = $_
Get-ExchangeCertificate -Server $srv |
Where-Object {$_.Status -eq "PendingRequest"} |
Select-Object @{n="Server";e={$srv}},Thumbprint,Services,Subject
}

İstek hala geçerliyse, yani CA’dan yanıt bekliyorsanız silmeyin. Yanıt dosyasını, isteği ürettiğiniz node’a Import-ExchangeCertificate ile aktarın. Private key ilk node’da durduğu için bir node’da üretilmiş isteğin yanıtı diğerine aktarılamaz.
Bekleyen bir yanıt yoksa ve Services alanı None ise isteği silin.
Remove-ExchangeCertificate -Server W25EXCNOD1 -Thumbprint -Confirm:$false
Services alanının None olduğunu mutlaka doğrulayın. Bir servise bağlı sertifikayı silmek o servisin durmasına yol açar.Bu ortamda kontrol sonucu: İki node’da da PendingRequest durumunda bir kayıt yok, tüm sertifikalar Valid. Güncel envanter:
| Thumbprint | Bulunduğu yer | Bağlı servisler | Ne olduğu |
|---|---|---|---|
7E4750C65B415B39DEB1B7673E4A3B5F770AA075 |
Her iki node (aynı thumbprint) | IIS, SMTP | Ortak SAN sertifikası, namespace bunun üzerinden çalışıyor |
98311F42FBC86BB92482CE3DF6FC5CD33872E9B1 |
Her iki node (aynı thumbprint) | SMTP | Auth certificate, organizasyon geneli |
9408289D2B4BDBF4C12A62DB18A352324F23A977 |
Sadece W25EXCNOD1 | IMAP, POP, IIS, SMTP | Kurulumda üretilen self-signed |
EB89B6944F0BA024DFC389354659A65576DE2F2E |
Sadece W25EXCNOD2 | IMAP, POP, IIS, SMTP | Kurulumda üretilen self-signed |
İlk iki satır ortamın doğru kurulduğunu gösteriyor: 7E4750C65B415B39DEB1B7673E4A3B5F770AA075 her iki node’da aynı thumbprint ile duruyor ve IIS’e bağlı, yani ortak namespace için üretilmiş tek bir SAN sertifikası iki node’a birden dağıtılmış. Auth certificate de organizasyon genelinde ortak. Üçüncü ve dördüncü satırdaki self-signed sertifikalar kurulumdan gelir, her node’da farklı olmaları normaldir. Bu dördüne dokunmayın.
A2. AMSI Request Body Scanning (Bulgu 10)
Bu maddede önce bir parantez açmak gerekiyor: raporda görünen False büyük ihtimalle yanlış pozitif.
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, kapalı gibi görünüyor.
| Durum | HealthChecker çıktısı | Gerçek durum |
|---|---|---|
| Override tanımlı değil | False | True (varsayılan açık) |
| Override = false | False | False |
| Override = true | True | True |
Bu yüzden iki seçeneğiniz var:
Seçenek 1 – Dokunmamak: Ortamda özellik zaten açıksa yapacak bir şey yok, bulgu yanlış pozitiftir. HealthChecker’ın güncel sürümüyle raporu tekrar alıp maddenin düşüp düşmediğini kontrol edebilirsiniz.
Seçenek 2 – Açıkça tanımlamak: Ayarı override ile açıkça belirlemek, hem raporu temizler hem de yapılandırmayı belgelendirir. Varsayılana güvenmek yerine niyeti yazılı hale getirmiş olursunuz.
Bu ortamda kontrol sonucu: Get-SettingOverride | Where-Object {$_.SectionName -eq "AmsiRequestBodyScanning"} çıktısı boş döndü, yani hiç override tanımlı değil; gerçek AMSI durumu tamamen varsayılana dayanıyor ve bunu doğrudan gösteren bir cmdlet de yok (Get-AmsiConfiguration diye bir komut mevcut değil). Bu belirsizliği ortadan kaldırmak, ayarı denetlenebilir kılmak ve raporu kalıcı olarak temizlemek için Seçenek 2’yi uyguladık:
New-SettingOverride -Name "EnableAMSIBodyScanAllProtocols" -Component "Cafe" -Section "AmsiRequestBodyScanning" -Parameters ("EnabledAll=True") -Reason "Enabling AMSI body Scan for all protocols"


Sadece belirli protokoller için açmak isterseniz:
New-SettingOverride -Name "EnableAMSIBodyScanForEcpEwsOwa" -Component "Cafe" -Section "AmsiRequestBodyScanning" -Parameters @("EnabledEcp=True","EnabledEws=True","EnabledOwa=True") -Reason "Enabling AMSI body Scan for ECP, EWS and OWA"
Parametrelerin hangi protokole karşılık geldiği:
| Parametre | Protokol / Servis | Ne için kullanılır |
|---|---|---|
EnabledAll |
Tüm protokoller | ActiveSync, Autodiscover, ECP, EWS, OWA ve diğer HTTP tabanlı Exchange protokollerinin tamamını kapsar |
EnabledEcp |
Exchange Control Panel (ECP) | Yönetim paneli (/ecp) üzerinden gelen istekler |
EnabledEws |
Exchange Web Services (EWS) | Outlook, mobil istemciler ve üçüncü parti entegrasyonların kullandığı API trafiği |
EnabledOwa |
Outlook on the Web (OWA) | Tarayıcı üzerinden webmail erişimi (/owa) |
Yani EnabledAll=True ile tek satırda tüm protokolleri açarken, ikinci komuttaki gibi sadece EnabledEcp, EnabledEws,EnabledOwa parametrelerini True verirseniz tarama yalnızca bu üç protokol için etkinleşir; ActiveSync veya Autodiscover gibi diğer protokoller kapsam dışı kalır. Ortamınızda hangi protokollerin dışarıya açık olduğunu bilmiyorsanız EnabledAll=True daha güvenli bir başlangıçtır.
Override’ın oluştuğunu doğrulayın:
Get-SettingOverride | Where-Object {$_.SectionName -eq "AmsiRequestBodyScanning"} | Format-List Name,ComponentName,SectionName,Parameters,Status
Beklenen çıktı:
Name : EnableAMSIBodyScanAllProtocols
ComponentName : Cafe
SectionName : AmsiRequestBodyScanning
Parameters : {EnabledAll=True}
Status : Accepted

Status: Accepted ayarın Active Directory’ye yazıldığı anlamına gelir, sunucularda etkin olduğu anlamına gelmez. SettingOverride organizasyon genelindedir ama devreye alma işlemi sunucu bazlıdır.Devreye almanın iki yolu var ve hangisini kullanacağınız planın neresinde olduğunuza bağlı:
Bu planı sırayla uyguluyorsanız ayrıca bir şey yapmanıza gerek yok. Faz B’nin B7 adımında her node zaten yeniden başlatılıyor. Sunucu açılışında topology servisi yapılandırmayı sıfırdan okur, IIS ve app pool’lar da yeniden başlar. Yani ayar, node bakım modundayken kendiliğinden devreye girer ve kullanıcı hiçbir kesinti hissetmez.
Bu maddeyi plandan bağımsız, tek başına uyguluyorsanız devreye almayı elle yapmanız gerekir.
Aşağıdaki komutları her node için ayrı ayrı çalıştırın:
Yapılandırmayı tazele (her node için ayrı)
Get-ExchangeDiagnosticInfo -Server W25EXCNOD1 -Process Microsoft.Exchange.Directory.TopologyService -Component VariantConfiguration -Argument Refresh
Get-ExchangeDiagnosticInfo -Server W25EXCNOD2 -Process Microsoft.Exchange.Directory.TopologyService -Component VariantConfiguration -Argument Refresh
IIS servislerini yeniden başlat (ilgili node üzerinde çalıştırılır)
Restart-Service -Name W3SVC, WAS -Force
W3SVC ve WAS servislerinin yeniden başlatılması OWA, EWS ve ActiveSync bağlantılarını kısa süreliğine keser. İki node’da aynı anda yapmayın. Önce bir node’u bakım moduna alın (B0 adımı), servisleri orada yeniden başlatın, bakımdan çıkarın (B8 adımı), sonra diğerine geçin.Varsayılan tarama boyutu 4096 bayttır, en fazla 1048576 bayta (1 MB) çıkarılabilir. Antivirüs çözümünüzün AMSI sağlayıcısı yüklü değilse bu ayarın pratik faydası olmaz.
A3. Edition: StandardEvaluation (Bulgu 11)
Her iki node StandardEvaluation sürümünde ve ~172 gün deneme süresi kalmış. Deneme süresi dolduğunda Exchange servisleri durur. Lisans anahtarını girin:
Set-ExchangeServer -Identity W25EXCNOD1 -ProductKey XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Set-ExchangeServer -Identity W25EXCNOD2 -ProductKey XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Anahtar girildikten sonra ilgili node’da Microsoft Exchange Information Store servisini yeniden başlatın (Faz B’deki restart bunu zaten kapsıyor).
Get-ExchangeServer | Format-Table Name,Edition,AdminDisplayVersion -AutoSize
A4. Download Domains (Bulgu 13, CVE-2021-1730 azaltması)
Raporda Enable Download Domains = False görünüyor. Bu ayar CVE-2021-1730 için azaltma sağlar: OWA’daki ek dosyalar ana namespace yerine ayrı bir host adı üzerinden servis edilir, böylece ek dosya içeriği oturum çerezlerine erişemez. Bu maddeyi tamamladığınızda “Bu Planda Kapsam Dışı” bölümündeki listeye giren 37 CVE’nin dışında kalan CVE-2021-1730 da kapanmış olur.
Bu maddede kapsam üç katmana ayrılıyor ve karıştırılması kolay:
| Katman | Kapsam | Kaç kez yapılır |
|---|---|---|
| DNS kaydı | Namespace bazlı | DNS bölgesinde bir kayıt |
| Sertifika SAN | Sunucu bazlı | Her node’un sertifikasında bulunmalı |
| Exchange yapılandırması | Organizasyon + sanal dizin | Tek komut, pipeline iki node’u da kapsar |
| App pool restart | Sunucu bazlı | Her node üzerinde ayrı ayrı |
DNS: tek kayıt
download.bakicubuk.com bir namespace, bir sunucu adı değil. Bu yüzden her node için ayrı kayıt oluşturulmaz. DNS bölgesinde tek bir CNAME kaydı açılır ve mevcut Exchange namespace’ine yönlendirilir:
download.bakicubuk.com CNAME mail.bakicubuk.com
CNAME’i doğrudan W25EXCNOD1.bakicubuk.com gibi bir node adına yönlendirmeyin. O node kapandığında download adresi de çalışmaz hale gelir. Kaydı namespace’e bağlarsanız, namespace hangi mekanizmayla çözülüyorsa (load balancer VIP, DNS round robin veya tek A kaydı) download adresi de aynı yolu izler.
İç ve dış DNS ayrıysa (split-brain), kayıt her iki bölgede de bulunmalıdır. OWA’yı dışarıya yayınlamıyorsanız iç bölge yeterlidir.
Add-DnsServerResourceRecordCName -ZoneName "bakicubuk.com" -Name "download" -HostNameAlias "mail.bakicubuk.com"
Resolve-DnsName download.bakicubuk.com

Sertifika: her iki node
Sertifikalar sunucu bazlı olduğu için download.bakicubuk.com adının her iki node’un IIS’e bağlı sertifikasında SAN olarak bulunması gerekir. Aksi halde istemci hangi node’a düşerse orada sertifika uyarısı alır.
"W25EXCNOD1","W25EXCNOD2" | ForEach-Object {
Get-ExchangeCertificate -Server $_ |
Where-Object {$_.Services -match "IIS"} |
Select-Object @{n="Server";e={$_}},Thumbprint,@{n="SAN";e={$_.CertificateDomains -join ", "}}
}
Bu ortamda IIS’e bağlı ortak SAN sertifikası (7E4750C65B415B39DEB1B7673E4A3B5F770AA075) zaten iki node’da da mevcut, A1’deki envanterde görünüyor. Dolayısıyla yapılacak iş yeni sertifika üretmek değil, mevcut sertifikayı download.bakicubuk.com adını da kapsayacak şekilde yenilemek. Bu işlem bu yazının kapsamı dışında; yenileme yapmadan Download Domains maddesini atlayabilirsiniz, zorunlu bir adım değil (ancak CVE-2021-1730‘un tam kapanması için gereklidir).

Exchange yapılandırması: tek komut
Get-OwaVirtualDirectory parametresiz çalıştığında organizasyondaki tüm OWA sanal dizinlerini döndürür, yani her iki node’u da kapsar. Ayrı ayrı çalıştırmanıza gerek yok.
Get-OwaVirtualDirectory | Set-OwaVirtualDirectory -ExternalDownloadHostName "download.bakicubuk.com" -InternalDownloadHostName "download.bakicubuk.com"
Set-OrganizationConfig -EnableDownloadDomains $true

App pool restart: her iki node
Ayarın devreye girmesi için OWA app pool’unun yeniden başlaması gerekir.
Bu planı sırayla uyguluyorsanız ayrıca bir şey yapmayın; B7 adımındaki yeniden başlatma app pool’ları da kapsar.
Tek başına uyguluyorsanız Restart-WebAppPool yerel sunucuda çalışır, uzak node’u hedefleyemez. Komutu her node üzerinde ayrı ayrı, node bakım modundayken çalıştırın:
Restart-WebAppPool -Name "MSExchangeOWAAppPool"


Doğrulama:
Get-OrganizationConfig | Format-List EnableDownloadDomains
Get-OwaVirtualDirectory | Format-List Server,ExternalDownloadHostName,InternalDownloadHostName

Faz B: Sunucu Bazlı Düzeltmeler
Aşağıdaki adımlar her iki node üzerinde ayrı ayrı uygulanır. Önce pasif node ile başlayın. Hangi node’un pasif olduğunu Faz 0’daki çıktıya göre belirleyin; sıra, DAG’ınızın o anki durumuna göre değişebilir.
B0. Ön kontrol ve bakım moduna alma
Faz 0’daki kontrolleri çalışmanın başında bir kez yapmıştık. Burada kısa bir tekrar var ve bilinçli: aradan zaman geçmiş, bir restart olmuş veya önceki denemeden kalıntı kalmış olabilir. Bakım moduna almadan hemen önce dört soruya cevap verin. Aynı bloğu B9’da ikinci node’a geçerken tekrar çalıştıracaksınız.
1. Aktif kopyalar nerede?
Bakıma alacağınız node pasif olmalı.
Get-MailboxDatabaseCopyStatus * | Format-Table Name,Status,MailboxServer,ActiveCopy,CopyQueueLength,ReplayQueueLength -AutoSize
Get-MailboxDatabaseCopyStatus -Server W25EXCNOD2 | Where-Object {$_.Status -eq "Mounted"}
İkinci komut boş dönmeli. Dönmüyorsa o node aktif kopyaları barındırıyor demektir; ya sırayı değiştirin ya da önce Move-ActiveMailboxDatabase ile kontrollü devredin.

Boş dönmüyorsa, aktif kopyayı diğer node’a devredin ve tekrar kontrol edin:
Move-ActiveMailboxDatabase -Identity DB02 -ActivateOnServer W25EXCNOD1
Get-MailboxDatabaseCopyStatus -Server W25EXCNOD2 | Where-Object {$_.Status -eq "Mounted"}
İkinci komut artık boş dönmeli. Dönmüyorsa devam etmeyin, sebebini araştırın.

Move-ActiveMailboxDatabase -Identity DB02 -ActivateOnServer W25EXCNOD1 komutu sonrası çıktı. DB01 ve DB02’nin aktif kopyaları artık ikisi de W25EXCNOD1‘de (ActiveCopy: True, Status: Mounted); W25EXCNOD2‘deki her iki kopya da Healthy ve ActiveCopy: False durumunda, yani W25EXCNOD2 tamamen pasif hale geldi. CopyQueueLength ve ReplayQueueLength her satırda 0, önceki geçici replay gecikmesi de kapanmış. İkinci komut (Get-MailboxDatabaseCopyStatus -Server W25EXCNOD2 | Where-Object {$_.Status -eq "Mounted"}) boş döndü beklenen sonuç bu; W25EXCNOD2 artık bakım moduna alınabilir durumda.

2. Hedef node kopyaları kabul edebilecek durumda mı?
Kopyalar diğer node’a taşınacak, o node’un bileşenleri hazır olmalı.
Get-ServerComponentState W25EXCNOD1 | Where-Object {$_.State -ne "Active"}
ForwardSyncDaemon ve ProvisioningRps normalde Inactive’dir, sorun değil. Listede HighAvailability veya ServerWideOffline çıkıyorsa durun; taşıma başarısız olur. Bu iki bileşen, önceki başarısız bir bakım denemesinden kalmış olabilir.

3. Kopyalar sağlıklı mı, kuyruklar boş mu?
Test-ReplicationHealth -Identity W25EXCNOD1 | Where-Object {$_.Result -ne "Passed"}
Test-ReplicationHealth -Identity W25EXCNOD2 | Where-Object {$_.Result -ne "Passed"}
İki komut da boş dönmeli. DisconnectedAndHealthy, Failed veya FailedAndSuspended bir kopya varken bakıma almayın.


4. Cluster ve quorum ayakta mı?
Get-ClusterNode | Format-Table Name,State -AutoSize
Get-ClusterQuorum
Her iki node Up, quorum kaynağı File Share Witness olarak görünmeli.
HighAvailability bileşenini Inactive bırakır. Ayrıntı için Sık Karşılaşılan Sorunlar bölümüne bakın.
Bakım moduna alma
Veritabanlarını önceden elle taşımanıza gerek yok. StartDagServerMaintenance.ps1 sırasıyla HubTransport’u Draining’e alır, kuyruktaki mesajları diğer node’a yönlendirir, cluster node’unu askıya alır, DatabaseCopyActivationDisabledAndMoveNow değerini $true yapar ve DatabaseCopyAutoActivationPolicy değerini Blocked olarak ayarlar, en son ServerWideOffline bileşenini Inactive yapar. Aktif kopyaları taşıyan, dördüncü maddedeki ayarın MoveNow kısmıdır.
cd $exscripts
.\StartDagServerMaintenance.ps1 -ServerName W25EXCNOD2
Healthy değilse veya kuyruk yüksekse taşıma başarısız olur ve script sunucuyu yarım bakım durumunda bırakabilir. Faz 0’daki kontrollerin sebebi budur. Scriptin çıktısını okumadan geçmeyin; hata verse bile bazı bileşenleri değiştirmiş olur.
Doğrulama:
Get-ServerComponentState W25EXCNOD2 | Format-Table Component,State -AutoSize
Get-ClusterNode W25EXCNOD2 | Format-List Name,State
Get-Queue -Server W25EXCNOD2
Beklenen: Get-ServerComponentState çıktısında ServerWideOffline: Inactive görünmeli. ServerWideOffline bir tür ana anahtardır: Inactive olduğunda altındaki neredeyse tüm bileşenler (HubTransport, FrontendTransport, EcpProxy, EwsProxy, OwaProxy,MapiProxy gibi tüm proxy’ler dahil) de otomatik olarak Inactive raporlanır bu normaldir, tek tek kontrol etmenize gerek yok. Bunun tek istisnası Monitoring ve RecoveryActionsEnabled‘dır; bunlar node bakımdayken bile Active kalmalı, çünkü Managed Availability’nin sağlık izleme ve kendi kendini onarma mekanizmaları offline bir sunucuda da çalışmaya devam eder. Get-ClusterNode çıktısında State: Paused görünmeli Up kalıyorsa node askıya alınmamış demektir, devam etmeyin. Get-Queue -Server çıktısında MessageCount düşük/0 olmalı; yüksekse kuyruk henüz boşalmamıştır, B1’e geçmeden bekleyin.


B1. PageFile ayarı (Bulgu 1, Kırmızı)
Rapordaki hata: System is set to automatically manage the PageFile Size: 0MB. Recommended PageFile size is 25% (8192MB) of the total system memory (32768MB).
Otomatik yönetim açıkken Win32_PageFileSetting boş dönebilir. Aşağıdaki blok her iki durumu da ele alıyor:
$cs = Get-CimInstance -ClassName Win32_ComputerSystem
Set-CimInstance -InputObject $cs -Property @{AutomaticManagedPagefile = $false}
$pf = Get-CimInstance Win32_PageFileSetting
if ($null -eq $pf) {
New-CimInstance -ClassName Win32_PageFileSetting -Property @{Name="C:\pagefile.sys"; InitialSize=8192; MaximumSize=8192}
} else {
Set-CimInstance -InputObject $pf -Property @{InitialSize=8192; MaximumSize=8192}
}

Get-CimInstance/Set-CimInstance (WS-MAN tabanlı) kullanıyor. Eski Get-WmiObject/.Put() (DCOM tabanlı) yöntemiyle özellikle Win32_ComputerSystem.AutomaticManagedPagefile yazılırken bazı sunucularda Exception calling ‘Put’: Generic failure hatası alınabiliyor; Win32_PageFileSetting tarafında bu sorun genelde görülmüyor. CIM cmdlet’leri bu hatayı yaşamıyor, o yüzden doğrudan bunları kullanın.Doğrulama (restart sonrası kesinleşir):
Get-CimInstance Win32_ComputerSystem | Select-Object AutomaticManagedPagefile
Get-CimInstance Win32_PageFileSetting | Select-Object Name, InitialSize, MaximumSize

B2. TCPKeepAlive (Bulgu 2, Kırmızı)
Rapordaki hata: Not Set. Without this value the KeepAliveTime defaults to two hours.
New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters" -Name "KeepAliveTime" -PropertyType DWORD -Value 1800000 -Force
Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters" -Name "KeepAliveTime"


Beklenen: KeepAliveTime = 1800000 (30 dakika)
B3. IPv6 yapılandırması (Bulgu 3, Kırmızı)
Rapordaki hata: IPv6 is disabled on some NIC level settings but not fully disabled. DisabledComponents registry value currently set to ‘0’.
Yani registry tarafı doğru (DisabledComponents = 0), sorun NIC seviyesinde IPv6 binding’inin kaldırılmış olması. Exchange bu yarı devre dışı durumu desteklemez.
Önce mevcut durumu görün:
Get-NetAdapterBinding -ComponentID ms_tcpip6 | Select-Object Name, DisplayName, Enabled

Her iki adapter (Ethernet0 ve Ethernet1) için binding’i etkinleştirin:
Enable-NetAdapterBinding -Name "*" -ComponentID ms_tcpip6
Get-NetAdapterBinding -ComponentID ms_tcpip6 | Select-Object Name, Enabled

Registry değerini de kontrol edin; 0 doğru değerdir, farklıysa kaldırın:
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters" -Name "DisabledComponents" -ErrorAction SilentlyContinue

Son durumu kontrol edin:
Get-NetAdapterBinding -ComponentID ms_tcpip6 | Select-Object Name, DisplayName, Enabled
Beklenen: her iki adapter için Enabled = True

B4. Visual C++ Redistributable (Bulgu 7 ve node farkı, Sarı)
Visual C++ 2012 tarafında durum her iki node’da aynı: mevcut sürüm eski (11.0.50727), ikisinde de güncelleme gerekiyor. Visual C++ 2013 tarafında ise node’lar arasında fark var:
| Node | Mevcut durum |
|---|---|
| W25EXCNOD1 | Error / Unknown paket bulunamıyor, temiz kurulum gerekiyor |
| W25EXCNOD2 | Kurulu ama eski sürüm (12.0.21005) üzerine güncelleme yeterli |
Exchange, Visual C++ 2012 ve 2013 Redistributable paketlerini özellikle arar; daha yeni sürümler (2015-2022) bunların yerine geçmez. Her iki paket için de hedef sürüm aynıdır:
| Paket | Hedef |
|---|---|
| Visual C++ 2012 x64 Update 4 | 11.0.61030 |
| Visual C++ 2013 x64 | 12.0.40664 |
Güncel indirme bağlantıları için: Microsoft Visual C++ Redistributable latest supported downloads
Kurulum sonrası doğrulama:
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall","HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" |
Get-ItemProperty | Where-Object { $_.DisplayName -like "*Visual C++*Redistributable*" } |
Select-Object DisplayName, DisplayVersion | Sort-Object DisplayName
Kurulum sonrası her iki node’da da VC++ 2012 ve 2013 aynı hedef sürümde olmalı; node’lar arasındaki tek fark burada kapanmış olur.

B5. Sleepy NIC (Bulgu 8, Sarı)
Her iki adapter için güç yönetimi kapatılmalı.
Get-NetAdapter -Physical | Where-Object { $_.Status -eq "Up" } | ForEach-Object {
Get-NetAdapterPowerManagement -Name $_.Name | ForEach-Object {
$_.AllowComputerToTurnOffDevice = "Disabled"
$_ | Set-NetAdapterPowerManagement
}
}
Get-NetAdapter -Physical | ForEach-Object { Get-NetAdapterPowerManagement -Name $_.Name | Select-Object Name, AllowComputerToTurnOffDevice }
Beklenen: AllowComputerToTurnOffDevice = Disabled veya Unsupported

B5b. Common Services Not Running (Bulgu 9, Sarı)
Rapor, MSComplianceAudit servisinin StartType: Automatic olarak ayarlı olmasına rağmen çalışmadığını gösteriyor. Servisin durumunu kontrol edin:
Get-Service MSComplianceAudit

Durmuşsa başlatın; bu servisin başlatılması restart gerektirmez:
Start-Service MSComplianceAudit
Get-Service MSComplianceAudit | Select-Object Name,Status,StartType
Beklenen: Status = Running, StartType = Automatic
B6. Replikasyon NIC’i ve DAG Ağ Ayrımı (Kontrol)
HealthChecker bunu bulgu olarak işaretlemiyor; ağ bölümünü satır satır okumak gerekiyor. Replikasyon NIC’i (Ethernet1) 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ı gerekir.
Bu, kozmetik bir ayrıntı değil. Exchange DAG ağlarını otomatik keşfederken NIC’lerin yapılandırmasına bakar. Replikasyon NIC’i MAPI NIC’i gibi yapılandırılmışsa ikisini ayıramaz, tek ağ altında birleştirir ve Misconfigured işaretler. Sonuç, Test-ReplicationHealth çıktısında ClusterNetwork kontrolünün başarısız olması ve kopyaların DisconnectedAndHealthy duruma düşmesidir.
Kendi ortamınızda kontrol edin:
Get-DnsClient | Select-Object InterfaceAlias, RegisterThisConnectionsAddress
Get-ClusterNetwork | Format-Table Name,State,Role,Address,AddressMask -AutoSize
Get-ClusterNetworkInterface | Format-Table Name,Node,Network,State,Adapter,Address -AutoSize
Get-DatabaseAvailabilityGroupNetwork -Identity EXCDAG | Format-List Name,Subnets,Interfaces,ReplicationEnabled,MapiAccessEnabled


Sağlıklı bir iki ağlı DAG’da Get-DatabaseAvailabilityGroupNetwork iki ağ döndürür ve replikasyon NIC’i için Registered In DNS = False, DNS sunucusu alanı boş olmalıdır. Get-DnsClient çıktısındaki RegisterThisConnectionsAddress = True 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.
Bu ortamda kontrol sonucu: her iki node’da da Ethernet1 için Registered In DNS = False ve DNS Server alanı boş, yani replikasyon arayüzü zaten doğru yapılandırılmış; ek bir işlem gerekmiyor.
Eğer kendi ortamınızda bu alan True görünüyorsa veya arayüzde bir DNS sunucusu tanımlıysa, iki adımla düzeltebilirsiniz.
Adım 1: Replikasyon NIC’ini temizleyin. Her iki node üzerinde ayrı ayrı, pasif node’dan başlayarak:
Set-DnsClient -InterfaceAlias "Ethernet1" -RegisterThisConnectionsAddress $false
Set-DnsClientServerAddress -InterfaceAlias "Ethernet1" -ResetServerAddresses
Get-NetIPConfiguration -InterfaceAlias "Ethernet1"
Replikasyon NIC’inde default gateway, DNS sunucusu ve DNS kaydı olmamalıdır. Tek sahip olması gereken şey IP adresi ve alt ağ maskesidir.
Adım 2: Cluster ağ rolünü ayarlayın. Replikasyon ağının rolü Cluster Only, MAPI ağının rolü ClusterAndClient olmalıdır. Hangi cluster network’ün hangi alt ağa karşılık geldiğini yukarıdaki çıktıdan doğrulayın:
(Get-ClusterNetwork "Cluster Network 1").Role = 1
Get-ClusterNetwork | Format-Table Name,State,Role,Address -AutoSize
Rol değerleri: 0 = cluster kullanmaz, 1 = yalnızca cluster iletişimi (Cluster Only), 3 = cluster ve istemci (ClusterAndClient).
Set-DatabaseAvailabilityGroup EXCDAG -ManualDagNetworkConfiguration $true sonrası ağları elle tanımlarsınız. Bunu son çare olarak düşünün; NIC düzeltmesi çoğu zaman yeterli oluyor.B7. Yeniden başlatma
Bu adım, plandaki tüm restart gerektiren maddeleri tek seferde kapatır. Her node için bir kez yapılır ve node bakım modundayken gerçekleştiği için kullanıcı tarafında kesinti oluşmaz.
Yeniden başlatmanın kapsadıkları:
| Madde | Neden restart gerekiyor |
|---|---|
| B1 PageFile | Yeni sayfa dosyası boyutu açılışta devreye girer |
| B2 TCPKeepAlive | Registry değeri açılışta okunur |
| B3 IPv6 | NIC binding değişikliği açılışta kesinleşir |
| B4 Visual C++ | Kurulum restart isteyebilir |
| A2 AMSI Body Scanning | Topology servisi yapılandırmayı açılışta yeniden okur, IIS de yeniden başlar |
| A4 Download Domains | OWA app pool açılışta yeniden başlar |
Restart-Computer

Sunucu ayağa kalktıktan sonra Exchange servislerinin başladığını doğrulayın:
Get-Service MSExchange* | Where-Object {$_.StartType -eq "Automatic" -and $_.Status -ne "Running"}
Çıktı boş dönmelidir.

B8. Bakım modundan çıkma
cd $exscripts
.\StopDagServerMaintenance.ps1 -ServerName W25EXCNOD2

Doğrulama:
Get-ServerComponentState W25EXCNOD2 | Format-Table Component,State -AutoSize
Get-ClusterNode
Test-ReplicationHealth -Identity W25EXCNOD2
Get-MailboxDatabaseCopyStatus -Server W25EXCNOD2
Get-ServerComponentState çıktısında ServerWideOffline dahil neredeyse tüm bileşenler Active olmalı (ForwardSyncDaemon ve ProvisioningRps bu ortamda zaten normalde Inactive, B0’daki gibi göz ardı edebilirsiniz). Get-ClusterNode çıktısında ilgili node Up görünmeli. Test-ReplicationHealth çıktısında DatabaseAvailability dahil tüm kontroller Passed olmalı. Get-MailboxDatabaseCopyStatus çıktısında kopyalar Healthy, kuyruklar 0 olmalı.StopDagServerMaintenance.ps1, StartDagServerMaintenance.ps1 ile aynı sessiz başarısızlık davranışını gösterebilir: script hatasız biter ama ServerWideOffline ve HighAvailability Inactive kalmaya devam eder, bu da Test-ReplicationHealth çıktısında DatabaseAvailability kontrolünün FAILED dönmesine yol açar (kopyalar Get-MailboxDatabaseCopyStatus‘ta Healthy görünse bile). Bu durumda ayrıntı ve manuel çözüm için aşağıdaki “Bakım modundan çıkma da sessizce başarısız olabilir” başlığına bakın.Kopyalar Healthy duruma gelene ve CopyQueueLength sıfırlanana kadar ikinci node’a geçmeyin.



B9. İkinci node
Aktif kopyaları güncellenmiş node’a taşıyın, ardından B0 – B8 adımlarını ikinci node için tekrarlayın. B0’daki dört ön kontrolü atlamayın; bu kez hedef node az önce bakımdan çıkan node olacağı için Get-ServerComponentState çıktısında beklenmedik bir Inactive bileşen bulunmadığını doğrulayın.
Move-ActiveMailboxDatabase -Server W25EXCNOD1 -ActivateOnServer W25EXCNOD2 -Confirm:$false
Get-MailboxDatabaseCopyStatus * | Where-Object {$_.Status -eq "Mounted"} | Format-Table Name,MailboxServer -AutoSize
Faz C: Doğrulama
C1. DAG sağlığı
Get-DatabaseAvailabilityGroup EXCDAG -Status | Format-List Name,Servers,WitnessServer,PrimaryActiveManager,OperationalServers
Test-ReplicationHealth -Identity W25EXCNOD1
Test-ReplicationHealth -Identity W25EXCNOD2
Get-MailboxDatabaseCopyStatus * | Format-Table Name,Status,CopyQueueLength,ReplayQueueLength,ContentIndexState -AutoSize
Get-ClusterNode
Get-ClusterQuorum




C2. Kopyaları dengeleme
cd $exscripts
.\RedistributeActiveDatabases.ps1 -DagName EXCDAG -BalanceDbsByActivationPreference -ShowFinalDatabaseDistribution -Confirm:$false
Script’in çıktısı üç bölümden oluşur ve okunması gereken sıra şudur: Starting Server Distribution, çalışmaya başlamadan önceki dağılımı gösterir (bu ortamda W25EXCNOD2 üzerinde 2 aktif, W25EXCNOD1 üzerinde 0 aktif kopya vardı, çünkü tüm bakım süreci boyunca aktif kopyalar sırayla W25EXCNOD2‘ye taşınmıştı). Starting Database Moves, script’in tercih listesine (PreferenceCountList) göre hangi veritabanını hangi node’a taşımaya çalıştığını satır satır gösterir; burada DB01 için AP = 2 olan W25EXCNOD2‘den AP = 1 olan W25EXCNOD1‘e taşıma denendi ve Database 'DB01' successfully moved from 'W25EXCNOD2' to 'W25EXCNOD1' mesajıyla başarılı oldu. Summary of Moves bölümündeki DbName detaylarında DB01 için MoveStatus: MoveSucceeded görünürken, DB02 için MoveStatus: NoMoveAttempted ve IsOnMostPreferredCopy: True görünür; yani DB02 zaten en tercih edilen kopyasında olduğu için script ona hiç dokunmadı. Son olarak Ending Server Distribution, her iki node için de 1 Active / 1 Passive dağılımı gösterir. Bu, DAG’ın artık aktivasyon tercihine göre tam dengeli olduğunu ve Faz 0’daki başlangıç durumuna döndüğünü doğrular; Successfully moved: 1, Failed to move: 0 satırları da işlemin sorunsuz tamamlandığını özetler.



C3. Raporu tazeleme
cd C:\Scripts
.\HealthChecker.ps1 -Server "W25EXCNOD1"
.\HealthChecker.ps1 -Server "W25EXCNOD2"
.\HealthChecker.ps1 -BuildHtmlServersReport -HtmlReportFile "EXCDAG-Report-After.html"
.\EXCDAG-Report-After.html
Sık Karşılaşılan Sorunlar
| Hata / Belirti | Sebep | Çözüm |
|---|---|---|
The database copy does not have a replication instance running |
Hedef node hala bakım modunda, yeni restart olmuş veya MSExchangeRepl durmuş |
Aşağıdaki teşhis sırasını izleyin |
Suspend-ClusterNode hata veriyor |
Aktif kopyalar hala o node üzerinde | Önce Move-ActiveMailboxDatabase çalıştırın |
Kopyalar Failed durumda kalıyor |
Node bakımdan tam çıkmamış | StopDagServerMaintenance.ps1, sonra Resume-MailboxDatabaseCopy |
ContentIndexState = NotApplicable |
Hata değil: Exchange SE’de BigFunnel, indeks veritabanının içinde | Aksiyon gerekmez |
| Bakımdan çıkışta kuyruk boşalmıyor | Transport hala Draining | Set-ServerComponentState ... -Component HubTransport -State Active |
Bakım moduna alma sessizce başarısız, HighAvailability Inactive kalıyor |
Script taşıma adımında hata alıp geri almıyor | Aşağıdaki alt başlığa bakın |
StartDagServerMaintenance.ps1 hatasız biter ($? = True, -Verbose bile çıktı vermez) ama ServerWideOffline Active kalır |
Script bir ön koşulda sessizce erken çıkıyor olabilir | “StartDagServerMaintenance.ps1 sessizce hiçbir şey yapmadan bitiyor” başlığındaki adımları uygulayın: Set-MailboxServer -DatabaseCopyActivationDisabledAndMoveNow $true, -DatabaseCopyAutoActivationPolicy Blocked, Set-ServerComponentState ... HubTransport Draining, Suspend-ClusterNode, en son Set-ServerComponentState ... ServerWideOffline Inactive |
ServerWideOffline: Inactive sonrası Get-ServerComponentState çıktısında neredeyse tüm bileşenler (HubTransport, FrontendTransport, tüm proxy’ler) de Inactive görünüyor |
Hata değil: ServerWideOffline bir ana anahtardır, Inactive olunca altındaki bileşenler de Inactive raporlanır |
Aksiyon gerekmez. Yalnızca Monitoring ve RecoveryActionsEnabled‘ın Active kaldığını doğrulayın; bunlar Managed Availability’nin offline sunucuda da çalışması için kasıtlı olarak Active bırakılır |
B1’de $cs.Put() çalıştırınca "Exception calling 'Put': Generic failure" hatası |
Eski Get-WmiObject/.Put() (DCOM tabanlı) yöntemi, özellikle Win32_ComputerSystem.AutomaticManagedPagefile yazarken bazı sunucularda başarısız oluyor |
Get-CimInstance/Set-CimInstance (WS-MAN tabanlı) kullanın — bu hatayı yaşamıyor |
| B4 doğrulamasında Visual C++ 2013 için kayıt defterinde iki sürüm birden görünüyor (ör. 12.0.30501 ve 12.0.40664) | Yükleyici eski sürümü kaldırmadan üzerine yeni sürümü kurmuş, iki kayıt bir arada kalmış | Hata değil; hedef sürümün (12.0.40664) listede bulunduğunu doğrulamanız yeterli, eski kaydı elle kaldırmanıza gerek yok |
StopDagServerMaintenance.ps1 hatasız biter ama ServerWideOffline/HighAvailability Inactive kalır, Test-ReplicationHealth DatabaseAvailability FAILED verir |
Script, Start scriptindeki ile aynı şekilde bir ön koşulda sessizce erken çıkıyor | “Bakım modundan çıkma da sessizce başarısız olabilir” başlığındaki adımları uygulayın: Resume-ClusterNode, Set-ServerComponentState ... HubTransport Active, Set-MailboxServer ... -DatabaseCopyActivationDisabledAndMoveNow $false -DatabaseCopyAutoActivationPolicy Unrestricted, en son Set-ServerComponentState ... ServerWideOffline Active |
HighAvailability düzeltildikten sonra bile Test-ReplicationHealth DatabaseAvailability FAILED veriyor: "database copy auto activation policy configuration of 'Blocked'" |
DatabaseCopyAutoActivationPolicy (ve/veya DatabaseCopyActivationDisabledAndMoveNow) bakım moduna girişten kalma, HighAvailability‘den bağımsız bir kalıntı |
Get-MailboxServer <sunucu> | Format-List DatabaseCopyAutoActivationPolicy,DatabaseCopyActivationDisabledAndMoveNow ile kontrol edin, Set-MailboxServer <sunucu> -DatabaseCopyAutoActivationPolicy Unrestricted ve -DatabaseCopyActivationDisabledAndMoveNow $false ile düzeltin |
StartDagServerMaintenance.ps1 sessizce hiçbir şey yapmadan bitiyor
Belirti. Script çalıştırılıyor, $? True dönüyor, yani PowerShell hata görmüyor. -Verbose parametresiyle çalıştırsanız bile tek satır çıktı gelmiyor. Ancak Get-ServerComponentState çıktısında ServerWideOffline hala Active, yani script hiçbir şey değiştirmemiş. Bu, aşağıdaki “HighAvailability yarım kalıyor” senaryosundan farklıdır; orada bileşenlerin bir kısmı değişmiş ve yarım kalmıştı, burada script sanki hiç çalışmamış gibi görünüyor.
Kök sebep.$? True olması scriptin hata fırlatmadığını gösterir, ama gerçekten işini tamamladığı anlamına gelmez. En olası açıklama, script içindeki bir ön koşul kontrolünün hata basmadan return ile sessizce durmasıdır; yani script bir kontrolü geçemiyor ama bunu kullanıcıya bildirmiyor. Bu noktada scripti tekrar tekrar çalıştırmak ya da -Verbose ile debug etmeye çalışmak zaman kaybettirir; script içindeki kontrolü görmeden hangi koşulun engellediğini dışarıdan kestirmek mümkün değildir.
Ne zaman elle devam edilir. DAG tarafında güvenli olduğunuzdan emin olun: aktif kopyalar zaten manuel olarak diğer node’a taşınmış olmalı (B0’daki 1. madde) ve Test-ReplicationHealth her iki node için de temiz dönmeli. Bu iki şart sağlanıyorsa scripti daha fazla debug etmek yerine bakım moduna elle devam edebilirsiniz:
Set-MailboxServer -Identity W25EXCNOD2 -DatabaseCopyActivationDisabledAndMoveNow $true
Set-MailboxServer -Identity W25EXCNOD2 -DatabaseCopyAutoActivationPolicy Blocked
Set-ServerComponentState W25EXCNOD2 -Component HubTransport -State Draining -Requester Maintenance
Suspend-ClusterNode W25EXCNOD2
Set-ServerComponentState W25EXCNOD2 -Component ServerWideOffline -State Inactive -Requester Maintenance
Ardından B0’daki doğrulama bloğunu çalıştırın; ServerWideOffline dahil bileşenlerin (Monitoring ve RecoveryActionsEnabled hariç) Inactive, ClusterNode durumunun Paused olduğunu görmelisiniz.
StartDagServerMaintenance.ps1‘in normalde sırayla yaptığı işlemlerin elle tekrarıdır: önce aktivasyonu engelleyip MoveNow bayrağını kaldırıyorsunuz (Set-MailboxServer), sonra transport’u boşaltıyorsunuz (HubTransport Draining), sonra cluster node’unu askıya alıyorsunuz (Suspend-ClusterNode), en son ana anahtarı kapatıyorsunuz (ServerWideOffline Inactive). Script’in aksine bu sırayı siz kontrol ettiğiniz için her adımdan sonra ara doğrulama yapabilirsiniz.Bakım moduna alma başarısız oluyor, HighAvailability yarım kalıyor
Belirti. StartDagServerMaintenance.ps1 çalıştırılıyor, hata veriyor veya sessizce dönüyor. Sonrasında Get-ServerComponentState çıktısında ServerWideOffline ve HubTransport Active görünüyor, yani bakım modu uygulanmamış, ama HighAvailability Inactive kalmış.
Kök sebep. Script bileşenleri belirli bir sırada değiştirir ve HighAvailability bileşenini Inactive yapmak bu sıranın ilk adımlarındandır. Sonraki adım olan Move-ActiveMailboxDatabase başarısız olursa script durur, ancak yaptığı ilk değişikliği geri almaz. Her yeniden deneme aynı kalıntıyı üretir.
Bu durumda Test-ReplicationHealth şu hatayı verir:
DatabaseAvailability *FAILED* Availability Count: 1. Expected Availability Count: 2.
Server 'W25EXCNOD2' component (HighAvailability) state is offline.
Yani Exchange o node’u aktivasyon hedefi olarak saymaz; veritabanları tek kopyaya düşmüş gibi raporlanır.
Hangi requester yaptı?
Get-ServerComponentState W25EXCNOD2 -Component HighAvailability | Format-List Component,State,LocalStates
Çıktıdaki Requestor değeri genellikle Maintenance olur:
Component : HighAvailability
State : Inactive
LocalStates : {Requestor:Maintenance; State:Inactive; Timestamp:...}
Düzeltme. Önce temiz çıkış deneyin:
cd $exscripts
.\StopDagServerMaintenance.ps1 -ServerName W25EXCNOD2
Hala Inactive kalırsa, LocalStates çıktısındaki requester ile elle geri alın:
Set-ServerComponentState W25EXCNOD2 -Component HighAvailability -State Active -Requester Maintenance
Get-ServerComponentState W25EXCNOD2 -Component HighAvailability | Format-List Component,State,LocalStates
HighAvailability‘yi düzeltmek tek başına yeterli olmayabilir. Aynı kalıntı,Set-MailboxServer‘ın DatabaseCopyAutoActivationPolicy ve DatabaseCopyActivationDisabledAndMoveNow ayarlarında da bağımsız olarak kalabilir. Bu durumda Test-ReplicationHealth artık HighAvailability‘den değil, doğrudan aktivasyon politikasından şikayet eder:DatabaseAvailability *FAILED* Availability Count: 1. Expected Availability Count: 2.
Server 'W25EXCNOD2' has database copy auto activation policy configuration of 'Blocked'.
Bu durumda ikisini de kontrol edip düzeltin:
Get-MailboxServer W25EXCNOD2 | Format-List DatabaseCopyAutoActivationPolicy,DatabaseCopyActivationDisabledAndMoveNow
Set-MailboxServer W25EXCNOD2 -DatabaseCopyAutoActivationPolicy Unrestricted
Set-MailboxServer W25EXCNOD2 -DatabaseCopyActivationDisabledAndMoveNow $false
HighAvailability, DatabaseCopyAutoActivationPolicy ve DatabaseCopyActivationDisabledAndMoveNow üçü birbirinden bağımsız olarak takılı kalabilir. Birini düzelttikten sonra Test-ReplicationHealth çıktısını tekrar okuyun; hala FAILED dönüyorsa hata mesajının hangi ayarı işaret ettiğine bakıp onu da elle düzeltin, üçü de temizlenene kadar tekrarlayın.
Test-ReplicationHealth çıktısındaki başarısız kontrolleri giderin, sonra bakım moduna almayı deneyin. Yaygın kök sebeplerden biri B0’daki ön kontrollerin atlanması, bir diğeri ise B6’daki DAG ağ yapılandırmasının bozuk olmasıdır.Bakım modundan çıkma da sessizce başarısız olabilir
Belirti. StopDagServerMaintenance.ps1 çalıştırılıyor, tek satırlık bilgilendirme mesajı dışında hiçbir hata vermiyor. Ancak Get-ServerComponentState çıktısında ServerWideOffline ve HighAvailability hala Inactive, yani B0’daki bakım moduyla birebir aynı görünüyor. Test-ReplicationHealth çıktısında DatabaseAvailability kontrolü FAILED döner, hata mesajı HighAvailability bileşeninin offline olduğunu gösterir.
Kök sebep. Start scriptindeki ile aynı davranış: script belirli bir ön koşulda sessizce erken çıkıyor, kalan adımları uygulamıyor. Kopyaların kendisi (Get-MailboxDatabaseCopyStatus) Healthy ve kuyruklar 0 olabilir; sorun kopyalarda değil, component state’in geri açılmamasındadır.
Düzeltme. Aşağıdaki adımları elle, sırayla uygulayın:
Resume-ClusterNode -Name W25EXCNOD2
Set-ServerComponentState W25EXCNOD2 -Component HubTransport -State Active -Requester Maintenance
Set-MailboxServer W25EXCNOD2 -DatabaseCopyActivationDisabledAndMoveNow $false -DatabaseCopyAutoActivationPolicy Unrestricted
Set-ServerComponentState W25EXCNOD2 -Component ServerWideOffline -State Active -Requester Maintenance
Ardından B8’deki doğrulama bloğunu tekrar çalıştırın; ServerWideOffline dahil tüm bileşenlerin Active, cluster node durumunun Up ve Test-ReplicationHealth çıktısının tamamen Passed olduğunu görmelisiniz.
Resume-ClusterNode), sonra transport’u (HubTransport) ve aktivasyon politikasını (Set-MailboxServer) eski haline getiriyorsunuz, en son ana anahtarı (ServerWideOffline) açıyorsunuz. ServerWideOffline Active olduğunda, B0’daki cascade davranışının tam tersi gerçekleşir ve altındaki tüm bileşenler otomatik olarak Active’e döner.Replikasyon örneği çalışmıyor hatası
Bu hata, Move-ActiveMailboxDatabase sırasında en sık karşılaşılan hatadır ve genellikle sıra hatasından kaynaklanır: hedef node hala bakım modundadır. StartDagServerMaintenance.ps1 cluster node’unu askıya aldığı ve aktivasyon politikasını Blocked yaptığı için o node veritabanı kabul edemez.
Sırayla kontrol edin:
Get-ServerComponentState W25EXCNOD2 | Format-Table Component,State -AutoSize
Get-MailboxServer W25EXCNOD2 | Format-List DatabaseCopyAutoActivationPolicy,DatabaseCopyActivationDisabledAndMoveNow
Get-ClusterNode
Get-Service MSExchangeRepl -ComputerName W25EXCNOD2
Get-MailboxDatabaseCopyStatus -Server W25EXCNOD2
Test-ReplicationHealth -Identity W25EXCNOD2
Beklenen değerler:
| Kontrol | Beklenen |
|---|---|
ServerWideOffline |
Active |
DatabaseCopyAutoActivationPolicy |
Unrestricted |
DatabaseCopyActivationDisabledAndMoveNow |
False |
| Cluster node durumu | Up |
MSExchangeRepl servisi |
Running |
| Kopya durumu | Healthy |
Bakım modundan çıkmadıysanız önce onu tamamlayın:
cd $exscripts
.\StopDagServerMaintenance.ps1 -ServerName W25EXCNOD2
Node yeni restart olduysa servislerin ayağa kalkması bir iki dakika sürebilir; beklemek yeterlidir.
-SkipActiveCopyChecks parametresini kullanmayın. O parametre doğrulamayı atlar, sorunu çözmez. Kopya gerçekten sağlıksızken taşıma yaparsanız veritabanı hedefte mount olmayabilir. Doğrulama sizi korumak için oradadır.Kapanış Kontrol Listesi
| # | Bulgu | Beklenen Sonuç | Durum |
|---|---|---|---|
| 1 | PageFile | 8192 / 8192, otomatik yönetim kapalı | |
| 2 | TCPKeepAlive | 1800000 | |
| 3 | IPv6 | Tüm adapterlerde Enabled = True | |
| 7 | Visual C++ 2012 x64 | 11.0.61030 | |
| 8 | Sleepy NIC | Disabled | |
| 9 | Common Services Not Running | MSComplianceAudit Running |
|
| 10 | AMSI Body Scanning | SettingOverride Accepted | |
| 11 | Edition | Standard (Evaluation değil) | |
| 12 | Visual C++ 2013 x64 (node farkı) | 12.0.40664, her iki node’da aynı | |
| 13 | Download Domains | True (opsiyonel) | |
| – | Sertifika | PendingRequest kaydı yok | |
| – | A2 ve A4 restart sonrası etkin | Ayarlar devrede | |
| – | Replikasyon NIC DNS kaydı | False | |
| – | DAG sağlığı | Tüm testler Passed |
Bu liste tamamlandığında raporda geriye yalnızca 4 ve 5 numaralı maddeler (CVE listesi ve son SU) kalacak. Onları da SU10 (KB5121608) kurulumuyla kapatacağız.
Sonuç
Bu çalışmanın sonunda EXCDAG ortamındaki 4 kırmızı bulgunun üçü (PageFile, TCPKeepAlive, IPv6) ve 7 sarı bulgunun altısı (Visual C++ 2012, Sleepy NIC, Common Services Not Running, AMSI Request Body Scanning, Edition, Known Issue) kapanmış olacak; ayrıca node’lar arasındaki tek fark olan Visual C++ 2013 durumu da giderilecek. Geriye kalan iki madde, güvenlik açığı listesi ve kurulu olmayan son Security Update, aynı kökten geliyor: sunucular SU10 öncesi bir build üzerinde çalışıyor.
Sertifika tarafında bu turda yalnızca bir doğrulama yaptık: önceki raporda görülen PendingRequest kaydı bu raporda yok, tüm sertifikalar Valid durumda. Ancak DAG ortamında sertifika yönetimi (SAN planlama, namespace ilişkisi, auth certificate, iki node’a dağıtım ve yenileme) kendi başına bir yazıyı hak ediyor, onu ayrıca ele alacağım.
Bir sonraki yazıda DAG yapısında Security Update kurulumunu adım adım yapacağız: bakım moduna alma, pasif node’dan başlayarak SU10 (KB5121608) kurulumu, switchover ve veritabanı kopyalarının activation preference değerlerine göre yeniden dengelenmesi.
Buradaki en önemli alışkanlık şu: her fazın sonunda Test-ReplicationHealth ve Get-MailboxDatabaseCopyStatus çıktılarını kontrol etmeden bir sonraki adıma geçmeyin. DAG’da hata, işlemi yaptığınız anda değil, bir sonraki failover’da ortaya çıkar.
İlgili Yazılar
- Exchange Server SE DAG Ortamında Sağlık Kontrolü: HealthChecker.ps1 ile Uçtan Uca
- Exchange Server SE Sağlık Kontrolü: HealthChecker.ps1 ile Uçtan Uca
- Exchange Server SE Güncelleme: HealthChecker ile Tespit Edilen Açıkları Kapatma
- Microsoft Exchange Server SE DAG Serisi Bölüm 4: Veritabanı Kopyaları, Switchover ve Yönetim
- Exchange Server Build Numbers
Başka bir yazmızda görüşmek dileğiyle…