How to Health Check an Exchange 2010 Mailbox Server

How many times each day do you get asked, “Is there a problem with the Exchange server?

If you’re like me then you get asked this question at least once per day. Of course there usually isn’t anything wrong with our Exchange servers ;) but once the question has been asked then you have no choice but to investigate and confirm that everything is okay.

In this article I’m going to demonstrate how you can quickly check the health of your Exchange Server 2010 mailbox servers, and share a script with you that can help to speed up this task.

Note: a better version of this script is now available here.

Exchange Server 2010 has a series of PowerShell cmdlets that make it easy to do a health check of mailbox servers. For example, we can:

That’s quite a few cmdlets to run, especially if we’ve got more than one mailbox server in the organization. And of course each of those cmdlets needs to run and show you output that you need to interpret.

I like to make life a bit easier and use PowerShell scripts to speed up these types of tasks. So naturally I put together a script for performing all of the above tests (and a few more) on my mailbox servers and display a nice simple colour-coded output so that I can tell at a glance whether there might be a problem.

This isn’t designed to do a diagnosis of any problems, it just checks the fundamentals and gives me a simple pass/fail and a few other indicators that I can then troubleshoot further if necessary.

Note: a better version of this script is now available here.

Extract Test-MailboxServer.ps1 from the Zip file and run it in your Exchange Management Shell to see output such as this:

If you have any questions or bugs to report please let me know in the comments below.

Change log:

  • V1.0, 20/11/2011 – Initial version
  • V1.1, 10/01/2011 – Fixed $null’s, bugs with Recovery DBs, and ping failure scenarios

Comments

    • Rajesh Allaparthy says

      Hi! I get the following error:

      VERBOSE: Connecting to Ex01.Welsoft.local
      VERBOSE: Connected to Ex01.Welsoft.local.
      The operation couldn’t be performed because object ‘DAG-01.Welsoft.local’ couldn’t be found on ‘DC01.welsoft.local’.
      + CategoryInfo : NotSpecified: (:) [Get-ExchangeServer], ManagementObjectNotFoundException
      + FullyQualifiedErrorId : 3D32AE05,Microsoft.Exchange.Management.Syste

        • Rajesh Allaparthy says

          Test-ExchangeServerHealth.ps1 V1.07, 24/11/2013

          .\Test-ExchangeServerHealth.ps1 -ServerList serverlist.txt -ReportMode -SendEmail

        • Rajesh Allaparthy says

          But we have more than 30+ DAG’s available on our environment, in that we need to monitor only one DAG. Rest of the DAG’s we need to ignore it.

        • Rajesh Allaparthy says

          I have added other servers(like ..EX08,EX09) and all other DAGs (like DAG-06, DAG-07 in Ignorelist.txt file. but still i got error.

          ************************************************************************************************************

          An Active Manager operation failed. Error An error occurred while attempting a cluster operation. Error: Cluster API ‘O
          penByNames(‘EX-08.Welsoft.local’, ‘EX-09.Welsoft.local’) failed for each server. Specific exceptions: ‘An
          Active Manager operation failed. Error An error occurred while attempting a cluster operation. Error: Cluster API ‘”Op
          enCluster(EX-09.Welsoft.local) failed with 0x6ba. Error: The RPC server is unavailable”‘ failed..’, ‘An Active M
          anager operation failed. Error An error occurred while attempting a cluster operation. Error: Cluster API ‘”OpenCluster
          (EX-08.Welsoft.local) failed with 0x6ba. Error: The RPC server is unavailable”‘ failed..’.’ failed..
          + CategoryInfo : InvalidArgument: (:) [Get-DatabaseAvailabilityGroup], AmClusterApiException
          + FullyQualifiedErrorId : 9BBFD80B,Microsoft.Exchange.Management.SystemConfigurationTasks.GetDatabaseAvailabilityGroup.
          ***********************************************************************************************************

  1. Kevin says

    Hi Paul,

    Great script. Thanks for sharing. It works great on all the mailbox servers in my DAG except for a server that I have that only holds passive database copies. On that server the mail flow test fails with an unable to open message store. Not a big deal, I was just wondering if you knew why.

    Thanks again.
    Kevin

  2. Kevin says

    Hi Paul,

    I just remembered that there is one active database on that server. There are no copies of the database anywhere. This is the error message I get for that server.

    Kevin

    ERROR MSG:

    Mail flow test: [Microsoft.Mapi.MapiExceptionRecoveryMDBMismatch]: MapiExceptionRecoveryMDBMismatch: Unable to open message store. (hr=0x80004005, ec=1165)

    + CategoryInfo : InvalidData: (:) [Test-Mailflow], RecipientTaskException
    + FullyQualifiedErrorId : DB35BF00,Microsoft.Exchange.Monitoring.TestMailFlow

  3. says

    Hi Paul,

    Cool script, I’ll definitely be keeping it on hand.

    Just one quick note on using $nul as opposed to $null: $nul is settable like any other variable, $null is and always will be null.

    If someone has, for whatever reason, set $nul to a value, this could play havoc with some scripts.

    Cheers,

    Chris

  4. Kevin says

    Hi Paul,

    Test-Mailflow on this server gives me the error: Unable to open message store.

    This server does have a recovery database on it. Is that the cause of the error?

    Thanks,
    Kevin

    • says

      Hi Kevin, I’ve put some RDBs in my test lab and can’t seem to reproduce the error you’re getting. Could you please try downloading the new version of the script and trying again?

      Also, when you’re running the script are you running it on the server that only has an RDB on it, or do you see the error when you run the script on another server or on your own workstation?

  5. Ram says

    HI Paul

    Am running this script under my lab 2010 which is having 2 Mailbox Server and NO DAG is implemneted till..

    When i ran the script it from the C: drive in server name SRV1

    it showing as

    Checking SRV1

    Ping test:—–Checking SRV2

    Ping Test: [PS] C:\>

    What is the issue

  6. Joe says

    Great Script – ran perfectly. I think I’ll tweak it and add the email functionality.
    Once again another great article.

  7. Mike Koch says

    Hi Paul,

    Great script, but I found one small bug.

    On line 254:

    $IsDAG = Get-MailboxServer $server.name

    generates an error when a single server name is supplied as an argument on the command line, because it’s just a string instead of an exchange server object. When no argument is supplied, you do a Get-ExchangeServer to retrieve all of the servers, but when an argument is supplied, you’re not doing anything with it.

    Change line 56 from:

    $mbservers = @($server)

    to this:

    $mbservers = @(Get-Exchangeserver $server)

    and that will fix it right up.

    Thanks again,
    Mike

  8. Pol says

    Thanks for this great script, very useful indeed!
    Could you add:
    1. Test-OutlookConnectivity (Protocol:TCP and HTTP)
    2. Test-SmtpConnectivity
    3 .Test-replicationhealth
    4. Queue reporting (Get-TransportServer | Get-Queue)

    it will be the best choice for any Exchange admin since it is a perfect combination of functionality and beauty.
    Thanks again for your great work !

  9. DavidDC says

    First of all, thanks for the script. is great.

    when I try to export the script output to a file, it is empty. Do You know the reason?

    I use this command:
    C: \ Scripts>. \ Test-MailboxServer.ps1 | ConvertTo-Html | Set-Content C: \ Scripts \ Logs \ Test-MailboxServer.html

    Sorry if my question is a bit silly

    Thanks for everything

    • says

      Not silly, the script is a bit lazy and just uses Write-Host to output to console. It wasn’t originally written with nicely formatted reports in mind :-)

      I’ll be updating it with proper PS objects and such so that HTML output is a possiblity, among other planned improvements.

      • DavidDC says

        Thanks for your time.
        I’m testing with the command Start-Transcript-path C: \ Scripts \ Logs \ Test-MailboxServer.csv at the beginning of the script and Stop-Transcript to end.

        It seems to work fine. Now I just send it by email.

        Thanks for everything.

  10. says

    I don’t want to sound like a goober but when I try to run the script I get the following error:

    The term ‘Test-MailboxServer.ps1′ is not recognized as the name of a cmdlet, function, script file……….

    What am I doing wrong?

  11. Mark says

    Thanks for the script. Looking forward for your next version. Sending an email alert to admin in the event of “RED” result would be nice.

  12. Oscar Pedroza says

    Tks Paul, its a great job…

    One question do you have any script to check the performance of Exchange Server 2010 on and typically installation method.

    Best regards,

  13. Robert says

    Hi Paul,

    great job. Big thx for the script. When can we expect a test script for the other exchange roles :-)

  14. ZEFel says

    in polish enviroment i’ve got ‘powodzenie’ (means success) in red color – Mail flow test: Powodzenie

  15. San says

    Hi Paul,

    This is wonderful script. It made my monitoring much easier. Please keep up with your good scripting work.

    Thanks Once again.

  16. CMRamos says

    I like the script, BUT it does not properly reflect DAG health. As noted below, your script shows everything Passed, but when we ran Test-ReplicationHealth the QuorumGroup check failed with an error on the DAG. Something to include in a future revision is Replication Health.

    —— Checking MBXP01
    DNS Check: Pass
    Server up: Pass
    Uptime (hrs): 2
    Server version: Exchange 2010
    Roles: Mailbox
    Mailbox Server Role Services: Pass
    Public Folder databases mounted: Pass
    Mailbox databases mounted: Pass
    MAPI connectivity: Pass
    Mail flow test: Success

  17. Sepehr Kazemi says

    Hey.
    My Exchange 2013 was working pretty well. After I deployed Sharepoint 2013, exchange got broken. First it was Port issue. I changed sharepoint’s. Now Exchange PowerShell Connects without a problem. running your script, it only shows dismounted mailbox failure and not checking mounted one. Running Test-MailFlow, It shows Failure. I’m talking general? I know, but any suggestion?

    • says

      You’ve installed Sharepoint on the Exchange server? I don’t recommend you do that. I’ve never tried it myself, so I have no idea what exactly it will break and how to work around it.

  18. says

    Hi Paul,

    Thank you for the script. It is working fine.
    I just wanted to add two more colums LatestFullBackupTime and LatestIncrementalBackupTime

    I tried hard but no luck.(I dont have much idea about scripting)

    Could you please suggest

    Thanks in advance

    Anant

  19. Brian says

    i noticed that once the script finds a mail server with a high copy/replay count (like a lagged database copy server), all the remaining servers after that are also shown in red, even though they do not have this issue. I don’t believe that variable is being reset in your loop through the server list :)

    Another issue, when i pass a server name at the command line instead of letting it run through all of our servers, the mail flow test fails with:

    Mail flow test: Skip, no active mailbox databases
    Cannot bind argument to parameter ‘Server’ because it is null.
    + CategoryInfo : InvalidData: (:) [Get-MailboxDatabaseCopyStatus], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Get-MailboxDatabaseCopyStatus

  20. Jose RIos says

    HI Paul,

    I have just one server (mbx, hub and cas) and i’m getting this error:

    Add-Member : Cannot bind argument to parameter ‘name’ because it is null.

    Note: I,m running it on the same server where exchange 2010 is installed (windows 2008 r1)

    Any idea?

    Regards

    JO

    • says

      Run the script with the -Log switch and then email me the log file to paul at exchangeserverpro.com and I can take a closer look. If possible attach one of the report emails as well so I can see the HTML results too.

  21. sam says

    HI Paul, great script thank you. one issue though,

    The script can not send email notifications when a vital service like the transport service is off if the smtp settings used are for the internal server and the environment has only one server, how can the smtp setting be changed to accommodate external smtp settings like for google that may require authentication.

    thank you.

Leave a Reply

Your email address will not be published. Required fields are marked *