A new version of Test-ExchangeServerHealth.ps1 is now available for download. This update contains the following fixes and improvements:
- Shadow redundancy queues are no longer included in the transport queue size
- Recovery DBs are now excluded from all Get-MailboxDatabase commands, to avoid issues running tests against them
- Content index state of “Autosuspended” (introduced in recent CUs) is now catered for as a healthy state
- Incorrect reporting of Test-ReplicationHealth results for different versions has been fixed
- Various formatting, readability and other minor issues fixed
You can download the script from the TechNet Script Gallery. For more information on how to use Test-ExchangeServerHealth.ps1, please refer to this blog post.
Hello Paul
Does this script for Exchange 2019 server as well?
Manoj
For the non-english Exchange environment users:
If you receive errors at “Mail Flow Test”, you should do the test manually and check the value of the positive result.
Around line 1202 you will find
if ($testmailflowresult -eq “Erfolgreich” -or $testmailflowresult -eq $success)
As you see, it checks the value and on a German system, it is Erfolgreich (which means Success).
Keep up the great work,
Pete
Recently, the script failed with this error as it can’t convert database value, please help
MAPI connectivity: Cannot process argument transformation on parameter ‘Database’. Cannot convert value “DB02” to type “Microsoft.Exchange.Configuration.Tasks.DatabaseIdParameter. Hashtable-to-Object conversion is not supported in restricted language or a Data section.”
Hi Lee,
You can try change following
Test-Mapiconnectivity -Database $db.Identity -PerconnectionTimeout $mapitimeout
to
Test-Mapiconnectivity -Database $db.Name -PerconnectionTimeout $mapitimeout
In my environment it works.
This is the best script I have. It’s been great forever. Can you add secure mail options? My preferred SMTP mailer requires a username and password. I can’t work out how to add this myself to the script (apologies if it’s already there, but I couldn’t see it).
Thanks again.
Thanks for sharing the script. The script is working perfectly.
But one of our exchange server’s mailflow result displaying result as failed while we using this script but actually the server do not have such issue.
Shall we know why the report is detecting such failure when the problem is not exist and how can we fixed it ?
Appreciate your response
Hi Paul, many thanks for this very useful health check script, just had a quick question regarding the exclusion file.
I have no issue listed servers that I want to exclude, however I have a challenge listing some databases to exclude, i.e I have some restore DBs which are unmounted and want to exclude them from a couple of servers but listing the database names don’t seem to work.
Could you advise what is the correct format to allow this to work.
Thanks, Fred
Hello Paul,
Since we have updated to Exchange 2016 CU11, we receive an error while the script is initializing.
WARNING: Cannot load Windows PowerShell snap-in Microsoft.Exchange.Management.PowerShell.E2010 because of the following error: Unable to load DLL ‘dsaccessperf.dll’: The specified module could not be found. (Exception from HR
ESULT: 0x8007007E)
Best regards,
Duncan
Hi Mr Paul
I ran scripts on HUB/CAS server, i had problem as below:
You must provide a value for this property.
+ CategoryInfo : NotSpecified: (0:Int32) [Get-MailboxDatabase], DataValidationException
+ FullyQualifiedErrorId : 8FE08272,Microsoft.Exchange.Management.SystemConfigurationTasks.GetMailboxDatabase
You must provide a value for this property.
+ CategoryInfo : NotSpecified: (0:Int32) [Get-MailboxDatabase], DataValidationException
+ FullyQualifiedErrorId : 8FE08272,Microsoft.Exchange.Management.SystemConfigurationTasks.GetMailboxDatabase
Script is great, however when checking the uptime there is an access denied error. Any idea why this would happen? The account running the script has Admin rights on each Exchange Server.
Is there an easy way to have the report show content index status for a server that doesn’t have a DAG? We have 3 databases not in a DAG
Hey Paul,
Thank you for all the great work! What is the frequency that we should be running this scripts. How often would you recommend ?
Rennex
Skipping CA checks.
Hi is it possible to add this line on the script
$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
We are getting CN errors due to server name.
Im having the same issue. I don’t want to use the server name and liked to use the common name. any suggestions
Awesome anf very useful script! We disable UM services in our environment. As a result, that service is reported as “Fail” with red box. Any way to get the script to bypass testing the UM service, or at least make it say “n/a” for that particular service?
The Real Person!
The Real Person!
Is there anything you gain by disabling the service?
If you want to leave it disabled, then you will need to customize the script to work around that. The script relies on the Test-ServiceHealth cmdlet for that part, so you would need to write some customizations that check which services aren’t running, and if it’s a service you have disabled change the status from failed to pass.
I had the same issue with the Mail Flow test fails. Even after changing the Internal URL for PowerShell to use the server name.
I needed to also change the internal PowerShell name to be HTTP not HTTPS.
Worked for me 🙂
Hello Lance I’m having the same error mine is already in the internal URL and internal PowerShell in Virtual directories are already in HTTP.
Can you please advice where did you change this?
Thanks
Hi Paul,
When I tried to run your script on Exchange 2016 CU8, I got error only on mailflow. On Exchange 2013 (same server setup) this script works perfectly.
Mail flow test: WARNING: Connecting to remote server email.xxxxx.com failed with the following error message : WinRM can not process the request. The following error occurred while using Kerberos authentication: Cannot find the computer email.xxxxx.com.
Verify that the computer exists on the network and that the name provided is spelled correctly. For more information, see the about_Remote_Troubleshooting Help topic.
WARNING: Cannot validate argument on parameter ‘Session’. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
Remove-PSSession : Cannot validate argument on parameter ‘Id’. The argument is null. Provide a valid value for the argument, and then try running the command again.
At C:\Scripts\Test-ExchangeServerHealth.ps1:452 char:22
+ Remove-PSSession $session.Id
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Remove-PSSession], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.RemovePSSessionCommand
Fail
Solved 🙂
Internal URL for PowerShell virtual directory was configured with public name.
Now everything is fine.
Thanks 🙂
I’m having the same issue. Can you explain what you changed? I am new to exchange and have looked at the virtual directories and the external and internal url’s are configured.
Just to update this, I just had the same problem in a Exchange 2016 DAG environment and fixed it by doing the following:
Go to “https://mailserver.domain.com/ecp”
Click on Servers, Virtual Directories and look down the list for powershell.
both my servers had public IP as internal address.
So mine was “mail.domain.com” i changed it to “exch01.sub.domain.com” and “exch02.sub.domain.com”
Now the script runs fine and passes.
Changing internal URL of PowerShell directory to server name resolved the issue.
Hello Paul,
We are running the script and send mail it says “Client Access Server Role Services” and “Hub Transport Server Role Services” fails. We are running script on Exchange management shell it doesnt give an error.
Client Access Server Role Services: Pass
Hub Transport Server Role Services: Pass
What can cause this error.
Exchange server version is 2010 SP3 UR 18
Thank you very much / Regards
The Real Person!
The Real Person!
Are they english-language servers?
Hello Paul
Thank you for reply.
Yes they are english servers.
Regards
The Real Person!
The Real Person!
The script uses the Test-ServiceHealth cmdlet for those checks. You can run that cmdlet yourself to see if it reports a problem. Without seeing your log file from running the script I can only guess what might be going wrong.
I have the same problem with Exchange 2016 CU 14. I have 2 severs and the server that runs the script reports fine but the other server shows Could not test service health for CS, HUB, MB and UM services. It is also vice versa the other direction. Is there something special the script is expecting for remote servers? I have been using your script on my Exchange 2010 servers with no problems for years. thx.
Paul,
Hope all is well with you my friend! Maybe you can help one of my clients with a problem they are seeing:
We are seeing the following error when the mailflow test runs against 2016 DAG members…
Mail flow test: WARNING: Connecting to remote server EXCH2016.Contoso.com failed with the following error message :
The WinRM client cannot process the request because the server name cannot be resolved. For more information, see the
about_Remote_Troubleshooting Help topic.
WARNING: Cannot validate argument on parameter ‘Session’. The argument is null or empty. Provide an argument that is n
ot null or empty, and then try the command again.
Remove-PSSession : Cannot validate argument on parameter ‘Id’. The argument is null. Provide a valid value for the
argument, and then try running the command again.
At C:\Enpointe\Test-ExchangeServerHealth.ps1:426 char:19
+ Remove-PSSession $session.Id
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Remove-PSSession], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.RemovePSSessionCommand
Fail
Any help would be greatly appreciated…:)
Hey Paul, Thank you for the script.
I have Exchange 2010 and 2016 currently running. Mail Flow Tests Fail on Exchange 2016 side but not 2010. I open up EMS and run “Test-MailFlow EXCH2016” and the mailflowresult comes back as Success. Any Suggestions?
Hello Paul,
We are running the script and send mail it says “Client Access Server Role Services” and “Hub Transport Server Role Services” fails. We are running script on Exchange management shell it doesnt give an error.
Client Access Server Role Services: Pass
Hub Transport Server Role Services: Pass
What can cause this error.
Exchange server version is 2010 SP3 UR 18
Thank you very much / Regards
Paul, I am having really really hard time getting to run in task scheduler. I followed your previous version guide and did what users have stated in the comments and nothing works for me. Can you please advice.
Thank you
The Real Person!
The Real Person!
Think of Task Scheduler as basically a cmd.exe session. If you can get a command line to run in cmd.exe, it will be easy to put it into Task Scheduler. So start in cmd.exe until you get the full command syntax correct.
Otherwise you’ll need to be clearer about what is not working for you.
I tried doing this from CMD
powershell.exe -command “. ‘C:Program FilesMicrosoftExchange ServerbinRemoteExchange.ps1′; Connect-ExchangeServer -auto; C:Scripts-ExchangeServerHealthTest-ExchangeServerHealth.ps1 -reportmode $true -sendemail $true”
And it does the command, but nothing happens.
The Real Person!
The Real Person!
Ok that’s different than what I recommend here:
https://www.practical365.com/exchange-server/powershell-script-exchange-server-health-check-report/
In the comments on that post I believe there’s some folks who also found slightly different syntax necessary for their particular version of Windows/PS.
I got the task scheduler to run now. My issues is that it takes a few hours to send the reports vs running manually takes 1-2 minutes. Can you advice? I love your books, really learned alot. Thanks
The Real Person!
The Real Person!
Add the -Log switch to the command so you can see which part of the script is taking so long.
Great! Thank you very much Paul
Thank you for taking the time to continue to work on this and for sharing it Paul. It’s much appreciated.