Exchange ServerTroubleshooting

Event ID 4999 on Exchange Server: reading MSExchange Common Watson crash reports

Decode MSExchange Common event 4999: which process failed, where and why, how to tell noise from real crashes, and how to match the report to bugs fixed in later updates.

Event ID 4999 from MSExchange Common is Exchange saying that one of its processes hit an unhandled exception or an unexpected condition, and that a Watson (Windows Error Reporting) report is being prepared. It looks cryptic, but it names the process, the component, the method and the exception, which is enough to decide whether you're looking at noise, a known bug fixed in a later update, or third-party code crashing Exchange. In this post I'll show how to read it and what to do with each answer.

Errors this guide fixes

  • Event ID 4999 (MSExchange Common)Application log+1 more guide
  • Watson report about to be sent for process idApplication log (event 4999)+1 more guide
  • An unhandled exception occurred and the process was terminated.Application log (ASP.NET 1325)
  • The process was terminated due to an unhandled exception.Application log (.NET Runtime 1026)
  • The following messages were loaded at startup before Transport crashed.Application log
  • M.E.C.TimeoutCache.DuplicateKeyExceptionApplication log (event 4999)
  • System.UnauthorizedAccessExceptionApplication log (event 4999)
  • System.OutOfMemoryExceptionApplication log (event 4999)
How this guide is organised: Symptoms → Why it happens → How to fix it → Verify the fix → Key takeawaysFlow diagram of the article's sections in reading order: 1. Symptoms. 2. Why it happens. 3. How to fix it (7 steps: Group the events; Decode the parameters; Check whether the process actually crashed; Identify the exact build; Match it to a known issue; and 2 more). 4. Verify the fix. 5. Key takeaways. Toolbox: Event ID 4999, Event ID 1325, Event ID 1026, EdgeTransport.exe, Exsetup.exe.1Symptoms2Why it happens3How to fix it4Verify the fix5Key takeaways1Group theevents2Decode theparameters3Check whetherthe process a…4Identify theexact build5Match it to aknown issue+2 moreTOOLBOXEvent ID 4999Event ID 1325Event ID 1026EdgeTransport.exeExsetup.exeHow this guide is organised: Symptoms → Why it happens → How to fix it → Verify the fix → Key takeawaysFlow diagram of the article's sections in reading order: 1. Symptoms. 2. Why it happens. 3. How to fix it (7 steps: Group the events; Decode the parameters; Check whether the process actually crashed; Identify the exact build; Match it to a known issue; and 2 more). 4. Verify the fix. 5. Key takeaways. Toolbox: Event ID 4999, Event ID 1325, Event ID 1026, EdgeTransport.exe, Exsetup.exe.1Symptoms2Why it happens3How to fix it1Group the events2Decode the parameters3Check whether the process actually crashed4Identify the exact build5Match it to a known issue+2 more4Verify the fix5Key takeawaysTOOLBOXEvent ID 4999Event ID 1325Event ID 1026EdgeTransport.exeExsetup.exe
At a glance: how this guide is organised · 7 fix steps · 5 key tools

Symptoms#

Event ID 4999 (MSExchange Common) errors like this one, taken from a Microsoft support article about Exchange 2019 CU8, appear in the Application log:

Text
Log Name:      Application
Source:        MSExchange Common
Event ID:      4999
Task Category: General
Level:         Error
Description:   Watson report about to be sent for process id: 3292, with parameters: E12IIS, c-RTL-AMD64, 15.02.0659.004, w3wp#MSExchangePowerShellFrontEndAppPool, M.Exchange.Security, M.E.S.A.F.CacheReader.AddEntry, M.E.C.TimeoutCache.DuplicateKeyException, 28e2-dumptidset, 15.02.0659.004. ErrorReportingEnabled: True

On recent builds the description continues with fields such as exStacktrace= that carry the stack trace. Around the same time you may also see:

  • ASP.NET event 1325: An unhandled exception occurred and the process was terminated. with an Application ID such as /LM/W3SVC/2/ROOT/EWS.
  • .NET Runtime event 1026: The process was terminated due to an unhandled exception., or Application Error event 1000 for the same process.
  • For transport crashes: The following messages were loaded at startup before Transport crashed.
  • Users seeing brief OWA, ActiveSync or EWS failures and Outlook reconnecting, mail pausing while transport restarts, or no visible impact at all.

Why it happens#

When Exchange code throws an exception nothing catches, Exchange writes event 4999 with the details Watson uses to group identical failures. If it was fatal, the process ends, but IIS starts a new worker process for the next request and the transport service starts a new EdgeTransport.exe, so the event may be the only trace. Some 4999s describe non-fatal conditions, and Microsoft has documented at least one that is safe to ignore. The usual root causes:

  • A product bug in your build, fixed in a later cumulative or security update.
  • An incomplete or non-elevated update that left binaries and configuration out of step.
  • Third-party code inside an Exchange process, such as transport agents, or file-level antivirus scanning Exchange processes and folders.
  • The environment: missing permissions (System.UnauthorizedAccessException), memory pressure (System.OutOfMemoryException), or one message or item that triggers the same bug every time.

How to fix it#

1. Group the events#

PowerShell
$since = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='MSExchange Common'; Id=4999; StartTime=$since} -ErrorAction SilentlyContinue |
  ForEach-Object {
    $p = ($_.Message -split 'with parameters: ')[1] -split ', '
    [pscustomobject]@{ Process = $p[3]; Method = $p[5]; Exception = $p[6]; Hash = $p[7] }
  } |
  Group-Object Process, Exception, Method, Hash | Sort-Object Count -Descending |
  Select-Object -First 15 Count, Name | Format-Table -AutoSize -Wrap

Work on the top line first. A handful of identical reports a week is a different problem from hundreds an hour.

2. Decode the parameters#

#ExampleMeaning
1–2E12IIS (or E12), c-RTL-AMD64Report type and build flavour; you can ignore them
315.02.0659.004Version of the Exchange code that raised it: 15.01 is Exchange 2016, 15.02 is Exchange 2019 and SE (SE builds start at 15.02.2562)
4w3wp#MSExchangePowerShellFrontEndAppPoolThe process; for IIS workers the application pool follows the #
5–6M.Exchange.Security, M.E.S.A.F.CacheReader.AddEntryComponent and method, with namespaces shortened to initials (M.E. is Microsoft.Exchange). Names that aren't Microsoft's point to third-party code
7M.E.C.TimeoutCache.DuplicateKeyExceptionThe exception type, the most useful field
8–928e2-dumptidset, versionA short hash you can treat as a fingerprint, and the module version (sometimes unknown)

ErrorReportingEnabled only tells you whether the server is set to send reports to Microsoft; it doesn't change the diagnosis.

3. Check whether the process actually crashed#

PowerShell
$e = Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='MSExchange Common'; Id=4999} -MaxEvents 1
Get-WinEvent -FilterHashtable @{LogName='Application'; StartTime=$e.TimeCreated.AddMinutes(-2); EndTime=$e.TimeCreated.AddMinutes(2)} |
  Where-Object { $_.Id -in 1000, 1026, 1325 } | Format-Table TimeCreated, ProviderName, Id -AutoSize
Get-CimInstance Win32_Process -Filter "Name='w3wp.exe'" |
  Select-Object ProcessId, CreationDate, @{n='AppPool';e={ if ($_.CommandLine -match '-ap "([^"]+)"') { $Matches[1] } }}
Get-Process EdgeTransport | Select-Object Id, StartTime

An exit event, or a worker or EdgeTransport process that started at the time of the 4999, confirms a crash and restart. No exit, no restart and no user impact means a non-fatal report: track it, but it isn't an outage.

4. Identify the exact build#

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

AdminDisplayVersion shows the cumulative update but not the security or hotfix update on top; the Exsetup.exe file version does. Compare it with Microsoft's build numbers page, or let Health Checker do it.

5. Match it to a known issue#

Search Microsoft Learn and Microsoft Support for "event ID 4999" together with the process and exception, and read the known issues in the Exchange Team Blog post for your update. Two documented examples show the pattern:

BuildProcess and exceptionMicrosoft's resolution
Exchange 2016 CU7edgetransport, System.UnauthorizedAccessException; Mailbox Transport Delivery won't startInstall CU10 or later
Exchange 2019 CU8w3wp#MSExchangePowerShellFrontEndAppPool, DuplicateKeyExceptionSafe to ignore; fixed in CU9

If a later update fixes your fingerprint, plan it with the CU pre-flight checklist.

6. Rule out third-party code#

PowerShell
Get-TransportAgent | Format-Table Identity, Enabled, Priority
Get-TransportAgent -TransportService FrontEnd | Format-Table Identity, Enabled, Priority
Disable-TransportAgent -Identity "Contoso Filter Agent"   # test in a maintenance window
Restart-Service MSExchangeTransport

For a front-end agent, add -TransportService FrontEnd and restart MSExchangeFrontEndTransport instead. If the crashes stop with the agent disabled, take the fingerprint to the vendor. Also compare your antivirus configuration with Microsoft's exclusion list. If transport keeps crashing on the same message, see poison message queue.

7. Repair a bad update#

If the reports started right after an update, check that it completed and rerun it from an elevated prompt; see installing Exchange security updates. If nothing matches, open a Microsoft support case with the grouped list, a full sample event and your exact build.

Verify the fix#

  • Run step 1 again with $since set to the time of your change: the fingerprint is gone over a full business cycle.
  • No new 1000, 1026 or 1325 events, and the affected worker or EdgeTransport keeps its original start time.
  • Test-ServiceHealth shows RequiredServicesRunning : True and users confirm the affected client works.

Key takeaways#

  • Read 4999 as process, method and exception; the hash is your fingerprint.
  • Many crash bugs are fixed in later updates, and Exchange Server SE is only supported while you keep it current.
  • Keep third-party code out of Exchange processes where you can, and install updates elevated.
  • Keep a weekly grouped report so new fingerprints stand out from known, documented ones.

References#

Revision history: Oct 2026 — re-checked against Microsoft Learn: 2 corrections.

Written and checked against current Microsoft Learn documentation. Test changes with a pilot group before rolling them out to everyone, and if an admin center path has moved since, search for the setting name instead.

Spotted a mistake, or did this fix work differently for you? Email me or message me on LinkedIn — corrections are credited in the article.

Written by

Omer Eltayeb

Intune Subject Matter Expert in Cairo, Egypt, former Microsoft Cloud Solutions Architect, Microsoft Certified Trainer and Microsoft Innovative Educator Expert (2024–26) and Microsoft Elevate Educator Expert (2026–27). I share practical, step-by-step guides, study plans, scripts and toolkits for Microsoft Intune, Configuration Manager, Microsoft Entra ID, Microsoft Defender, Exchange and Microsoft 365 with the community.

Microsoft Certified Trainer (MCT) 2026Microsoft Innovative Educator Expert 2025–2026Microsoft Elevate Educator Expert 2026–2027ISC2 Certified Information Systems Security Professional (CISSP)Microsoft 365 Certified: Enterprise Administrator Expert (MS-102)