Monitoring Microsoft Exchange Server 2010, 2013 and 2016 services with PowerShell script and task scheduler

Most enterprise environments have solutions that provide monitoring services to ensure Microsoft Exchange Server services are running and if they are not, restart the service and send an email notification to administrators but I have constantly come across smaller business that may not be able to afford such applications and therefore have implemented scripts with task manager scheduled tasks to provide some form of service monitoring. The Exchange Health Check Report by Paul Cunningham (https://practical365.com/exchange-server/powershell-script-exchange-server-health-check-report/) is great for daily reports but it is not practical to constantly use it for monitoring so what I’ve typically used is implement the service_check.ps1 script written by Kevin Olson:

Check for hung or stopped services
https://gallery.technet.microsoft.com/scriptcenter/Check-for-hung-or-stopped-67bc718d

The small adjustment I’ve made to the script is to move the Send-Mailmessage cmdlet to execute after the Start-Service because if you do not have another SMTP relay setup and need to rely on the Exchange server this script is monitoring, the email will not be sent out if the service that is hung or stopped is the transport service. The following are the scripts along with the Exchange services added into the script for each version:

Microsoft Exchange 2010

#NAME: service_check.ps1 

#AUTHOR: Kevin Olson

#DATE: 4/29/2011

#Machine to be monitored

$Computer = “brcl-exchange”

#Create an array of all services running

$GetService = get-service -ComputerName $Computer

#Create a subset of the previous array for services you want to monitor

$ServiceArray = “MSExchangeADTopology”,”MSExchangeAB”,”MSExchangeAntispamUpdate”,”MSExchangeEdgeSync”,”MSExchangeFDS”,”MSExchangeIS”,”MSExchangeMailSubmission”,”MSExchangeMailboxAssistants”,”MSExchangeMailboxReplication”,”MSExchangeProtectedServiceHost”,”MSExchangeRepl”,”MSExchangeRPC”,”MSExchangeSearch”,”MSExchangeServiceHost”,”MSExchangeSA”,”MSExchangeThrottling”,”MSExchangeTransport”,”MSExchangeTransportLogSearch”,”MSExchangeFBA”,”W3SVC”;

#Find any iWFM service that is stopped

foreach ($Service in $GetService)

{

    foreach ($srv in $ServiceArray)

    {

        if ($Service.name -eq $srv)

        {

            #check if a service is hung

            if ($Service.status -eq “StopPending”)

            {

            $servicePID = (gwmi win32_Service | where { $_.Name -eq $srv}).ProcessID

            Stop-Process $ServicePID

            Start-Service -InputObject (get-Service -ComputerName $Computer -Name $srv)

            #email to notify if a service is down

            Send-Mailmessage -to administrator@someDomain.com -Subject “$srv is hung on $Computer” -from exchange@contoso.com -Body “The $srv service was found hung.” -SmtpServer localhost

            }

            # check if a service is stopped

            elseif ($Service.status -eq “Stopped”)

            {

            #automatically restart the service.

            Start-Service -InputObject (get-Service -ComputerName $Computer -Name $srv)

                   #email to notify if a service is down

            Send-Mailmessage -to administrator@someDomain.com -Subject “$srv is stopped on $Computer” -from exchange@contoso.com -Body “The $srv service was found stopped.” -SmtpServer localhost

            }

        }

    }

}

The services I included in the script are all of the ones listed as Automatic as well as Automatic (Delayed Start):

image

Microsoft Exchange 2013

#NAME: service_check.ps1 
#AUTHOR: Kevin Olson
#DATE: 4/29/2011
 
#Machine to be monitored
$Computer = “bm1-azim-40-001”
 
#Create an array of all services running
$GetService = get-service -ComputerName $Computer
 
#Create a subset of the previous array for services you want to monitor
$ServiceArray = “HostControllerService”,”MSExchangeADTopology”,”MSExchangeAntispamUpdate”,”MSExchangeDagMgmt”,”MSExchangeDelivery”,”MSExchangeDiagnostics”,”MSExchangeEdgeSync”,”MSExchangeFastSearch”,”MSExchangeFrontEndTransport”,”MSExchangeHM”,”MSExchangeIS”,”MSExchangeMailboxAssistants”,”MSExchangeMailboxReplication”,”MSExchangeRepl”,”MSExchangeRPC”,”MSExchangeServiceHost”,”MSExchangeSubmission”,”MSExchangeThrottling”,”MSExchangeTransport”,”MSExchangeTransportLogSearch”,”MSExchangeUM”,”MSExchangeUMCR”,”W3SVC”;
 
#Find any iWFM service that is stopped
foreach ($Service in $GetService)
{
     foreach ($srv in $ServiceArray)
     {
         if ($Service.name -eq $srv)
         {
             #check if a service is hung
             if ($Service.status -eq “StopPending”)
             {
             $servicePID = (gwmi win32_Service | where { $_.Name -eq $srv}).ProcessID
             Stop-Process $ServicePID
             Start-Service -InputObject (get-Service -ComputerName $Computer -Name $srv)
             #email to notify if a service is down
             Send-Mailmessage -to administrator@someDomain.com -Subject “$srv is hung on $Computer” -from exchange@contoso.com -Body “The $srv service was found hung.” -SmtpServer localhost
             }
             # check if a service is stopped
             elseif ($Service.status -eq “Stopped”)
             {
             #automatically restart the service.
             Start-Service -InputObject (get-Service -ComputerName $Computer -Name $srv)
         #email to notify if a service is down
             Send-Mailmessage -to administrator@someDomain.com -Subject “$srv is stopped on $Computer” -from exchange@contoso.com -Body “The $srv service was found stopped.” -SmtpServer localhost
             }
         }
     }
}

The services I included in the script are all of the ones listed as Automatic as well as Automatic (Delayed Start):

image

World Wide Web Publish Service is also included.

Microsoft Exchange 2016

#NAME: service_check.ps1 
#AUTHOR: Kevin Olson
#DATE: 4/29/2011
 
#Machine to be monitored
$Computer = “prpmbx16-02”
 
#Create an array of all services running
$GetService = get-service -ComputerName $Computer
 
#Create a subset of the previous array for services you want to monitor
$ServiceArray = “HostControllerService”,”MSComplianceAudit”,”MSExchangeADTopology”,”MSExchangeAntispamUpdate”,”MSExchangeCompliance”,”MSExchangeDagMgmt”,”MSExchangeDelivery”,”MSExchangeDiagnostics”,”MSExchangeEdgeSync”,”MSExchangeFastSearch”,”MSExchangeFrontEndTransport”,”MSExchangeHM”,”MSExchangeHMRecovery”,”MSExchangeIS”,”MSExchangeMailboxAssistants”,”MSExchangeMailboxReplication”,”MSExchangeRepl”,”MSExchangeRPC”,”MSExchangeServiceHost”,”MSExchangeSubmission”,”MSExchangeThrottling”,”MSExchangeTransport”,”MSExchangeTransportLogSearch”,”MSExchangeUM”,”MSExchangeUMCR”,”W3SVC”;
 
#Find any iWFM service that is stopped
foreach ($Service in $GetService)
{
     foreach ($srv in $ServiceArray)
     {
         if ($Service.name -eq $srv)
         {
             #check if a service is hung
             if ($Service.status -eq “StopPending”)
             {
             $servicePID = (gwmi win32_Service | where { $_.Name -eq $srv}).ProcessID
             Stop-Process $ServicePID
             Start-Service -InputObject (get-Service -ComputerName $Computer -Name $srv)
             #email to notify if a service is down
             Send-Mailmessage -to administrator@someDomain.com -Subject “$srv is hung on $Computer” -from exchange@contoso.com -Body “The $srv service was found hung.” -SmtpServer localhost
             }
             # check if a service is stopped
             elseif ($Service.status -eq “Stopped”)
             {
             #automatically restart the service.
             Start-Service -InputObject (get-Service -ComputerName $Computer -Name $srv)
         #email to notify if a service is down
             Send-Mailmessage -to administrator@someDomain.com -Subject “$srv is stopped on $Computer” -from exchange@contoso.com -Body “The $srv service was found stopped.” -SmtpServer localhost
             }
         }
     }
}

The services I included in the script are all of the ones listed as Automatic (Microsoft Exchange Notifications Broker is excluded) as well as Automatic (Delayed Start):

image

World Wide Web Publish Service is also included.

Task Scheduler Configuration

One of the methods to execute the script repeatedly on the server is to create a task in the Task Scheduler as such:

image

Create a trigger and specify a Repeat task every however frequently you like:

image

Then create an action with powershell.exe as the Program/script and the following as the Add arguments (optional) field:

-command “& ‘C:Scriptsservice_check.ps1′”

image

Extra Setup Information

This script can be used for other services as well and an easy way of obtaining the service names to monitor is use cmdlets such as the one below to list all the services that contains, say, Microsoft Exchange:

Get-Service | Where {$_.DisplayName -like “Microsoft Exchange*”} | format-table -autosize

Status  Name                          DisplayName
——  —-                          ———–
Running HostControllerService         Microsoft Exchange Search Host Controller
Running MSComplianceAudit             Microsoft Exchange Compliance Audit
Running MSExchangeADTopology          Microsoft Exchange Active Directory Topology
Running MSExchangeAntispamUpdate      Microsoft Exchange Anti-spam Update
Running MSExchangeCompliance          Microsoft Exchange Compliance Service
Running MSExchangeDagMgmt             Microsoft Exchange DAG Management
Running MSExchangeDelivery            Microsoft Exchange Mailbox Transport Delivery
Running MSExchangeDiagnostics         Microsoft Exchange Diagnostics
Running MSExchangeEdgeSync            Microsoft Exchange EdgeSync
Running MSExchangeFastSearch          Microsoft Exchange Search
Running MSExchangeFrontEndTransport   Microsoft Exchange Frontend Transport
Running MSExchangeHM                  Microsoft Exchange Health Manager
Running MSExchangeHMRecovery          Microsoft Exchange Health Manager Recovery

Stopped MSExchangeImap4               Microsoft Exchange IMAP4
Stopped MSExchangeIMAP4BE             Microsoft Exchange IMAP4 Backend
Running MSExchangeIS                  Microsoft Exchange Information Store
Running MSExchangeMailboxAssistants   Microsoft Exchange Mailbox Assistants
Running MSExchangeMailboxReplication  Microsoft Exchange Mailbox Replication
Stopped MSExchangeNotificationsBroker Microsoft Exchange Notifications Broker
Stopped MSExchangePop3                Microsoft Exchange POP3
Stopped MSExchangePOP3BE              Microsoft Exchange POP3 Backend
Running MSExchangeRepl                Microsoft Exchange Replication
Running MSExchangeRPC                 Microsoft Exchange RPC Client Access
Running MSExchangeServiceHost         Microsoft Exchange Service Host
Running MSExchangeSubmission          Microsoft Exchange Mailbox Transport Submission
Running MSExchangeThrottling          Microsoft Exchange Throttling
Running MSExchangeTransport           Microsoft Exchange Transport
Running MSExchangeTransportLogSearch  Microsoft Exchange Transport Log Search
Running MSExchangeUM                  Microsoft Exchange Unified Messaging
Running MSExchangeUMCR                Microsoft Exchange Unified Messaging Call Router
Stopped wsbexchange                   Microsoft Exchange Server Extension for Windows Server Backup

Copy the output to a text file and extract the services as such:

HostControllerService

MSComplianceAudit

MSExchangeADTopology

MSExchangeAntispamUpdate

MSExchangeCompliance

MSExchangeDagMgmt

MSExchangeDelivery

MSExchangeDiagnostics

MSExchangeEdgeSync

MSExchangeFastSearch

MSExchangeFrontEndTransport

MSExchangeHM

MSExchangeHMRecovery

MSExchangeIS

MSExchangeMailboxAssistants

MSExchangeMailboxReplication

MSExchangeRepl

MSExchangeRPC

MSExchangeServiceHost

MSExchangeSubmission

MSExchangeThrottling

MSExchangeTransport

MSExchangeTransportLogSearch

MSExchangeUM

MSExchangeUMCR

One Response

  1. checking on service statuses is not perfectly a reliable way. Best is use powershell to check on the status of a web page in this case OWA and if the script is getting 404 error code then it restarts the services if not then it does not. or check on 200 which means the owa page is up and user is able to login to their mailbox