Exchange 2013 Performance Health Check Script

One of the recent additions to the TechNet script gallery was this nifty little contribution from Marc Nivens.

Exchange 2013 Performance Health Checker Script

This script reports on OS, system, and hardware information in addition to the Exchange 2013 sizing recommendations on TechNet.  It can be ran remotely, against a single server or a group of servers.  It takes some of the most common configuration causes of Exchange 2013 performance cases that we encounter in support and allows you to rule them out quickly without having to check each server or read through the entire TechNet guidance.

There are some parameters that can be specified, for example:

  • MailboxReport -    This optional parameter gives a report of the number of active and passive databases and mailboxes on the server.
  • Verbose    -    This optional parameter enables verbose logging.

Note that you may need to unblock the file in case of PSSecurityException  errors caused by the PowerShell execution policy.



Run against a single remote Exchange server:

.\HealthChecker.ps1 -Server SERVERNAME

Run against a single remote Exchange server with verbose logging and mailbox report enabled:

.\HealthChecker.ps1 -Server SERVERNAME -MailboxReport –Verbose


Run against all Exchange 2013 servers in the Organization:

Get-ExchangeServer | Where-Object {$_.AdminDisplayVersion -Match "^Version 15"} | For-EachObject  { .\HealthChecker.ps1 -Server $_.Name}


Sample Output

The below shows the tool running against a single Exchange 2013 server.

Exchange 2013 Health Check Script Output

This is also logged to the HealthCheck output file.  This defaults to the local folder when the script was executed from.

Thanks Marc for the tool!



Comments (9)
  1. anonymouscommenter says:


  2. Images are broken 🙁

  3. Appreciated the notice Fabian!

    I assume that when you click the image it takes you to the 404 error page?

    There has been an intermittent issue with the images on TechNet blogs, I’ll escalate this again.

    Some people will see the image and others will not.


  4. abdielnino says:

    Great script! just to clarify… to run on all servers, the correct sintaxis is:

    Get-ExchangeServer | Where-Object {$_.AdminDisplayVersion -Match "^Version 15"} | ForEach-Object {.HealthChecker.ps1 -Server $_.Name}


  5. Thanks – added the pesky {


  6. Vishwanath says:

    sTill the command for-eachobject is wrong, needed to change to foreach-object

    1. Since this is a long script, which line are you looking at please?

      1. Gregor Schillinger says:

        Hi Rhoderick,

        not in the script, but in the examples above to execute on all servers. For-EachObject should be ForEach-Object.

        1. Ah Thanks Gregor!

          Out, out you silly typo 🙂


Comments are closed.

Skip to main content