Recently I was interested in finding a way to monitor a windows service. What I needed was to check whether the service is running and if not running get a notification and try to restart the service. Following PowerShell script does exactly that, it checks for Microsoft CRM Asynchronous Service and the Microsoft CRM Asynchronous Maintenance Service activity and send 2 emails to Admin and Dev. This needs to be then scheduled using Windows Task Scheduler or SQL Server Job.
### Checking for CRM Async and Maintenance service failure and try restarting, if failing send an email notification.
## Function to send mail notification.
function Send_Email ([string]$strEmailSubject, [string]$strEmailBody)
{
$EmailFrom = "Arjuna@Email.com"
$EmailTo = "Admin@Email.com, Dev@Email.com"
$EmailSubject = $strEmailSubject
$EmailBody = $strEmailBody
$EmailSMTPServer = "SMTP.server.com"
## Creating Mail Message object.
$SMTPMessage = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo, $EmailSubject, $EmailBody
## Enabling HTML mail body.
$SMTPMessage.IsBodyHtml = $true
## Creating SMTP client object.
$SMTPClient = New-Object System.Net.Mail.SMTPClient $EmailSMTPServer
## Sending mail.
$SMTPClient.Send($SMTPMessage)
## Sending mail method 2.
##send-mailmessage -from "Arjuna@Email.com" -to "Admin@Email.com, Dev@Email.com" -subject "CRM Async Service Failed" -body "Please check." -smtpserver "SMTP.server.com"
## Sending mail method 2 using parameters.
##send-mailmessage -from $EmailFrom -to $EmailTo -subject $EmailSubject -body $EmailBody -smtpserver $EmailSMTPServer
}
## Function to check the service activity.
function Check_Service
{
## Get all services which has a Name like MSCRMAsyncService, Start Mode is Auto and service State is Running.
$FailedAsyncService = Get-WmiObject Win32_Service | Where-Object {$_.Name -like 'MSCRMAsyncService' -and $_.StartMode -eq 'Auto' -and $_.State -ne 'Running'} | Select-Object DisplayName
## For Testing.
##Write-Host "A: " $FailedAsyncService
## Get all services which has a Name like MSCRMAsyncService$maintenance, Start Mode is Auto and service State is Running.
$FailedAsyncMainteService = Get-WmiObject Win32_Service | Where-Object {$_.Name -like 'MSCRMAsyncService$maintenance' -and $_.StartMode -eq 'Auto' -and $_.State -ne 'Running'} | Select-Object DisplayName
## For Testing.
##Write-Host "B: " $FailedAsyncMainteService
## Checking whether the Async Service has failed.
if ($FailedAsyncService -ne $NULL)
{
## Trying to start the failed Async Service.
Start-Service -displayname "Microsoft Dynamics CRM Asynchronous Processing Service"
## Service Name can also be used to start the servie.
##Start-Service MSCRMAsyncService
## Get all services which has a Name like MSCRMAsyncService, Start Mode is Auto and service State is Running.
$AsyncServiceStarted = Get-WmiObject Win32_Service | Where-Object {$_.Name -like 'MSCRMAsyncService' -and $_.StartMode -eq 'Auto' -and $_.State -ne 'Running'} | Select-Object Name
## Checking the service to see whether it started.
if ($AsyncServiceStarted -ne $NULL)
{
## Calling Send_Mail function to notify.
Send_Email ("CRM Async Service Failed.") ("System has detected that the following CRM Async Service has failed. System automatically tried restarting the service but it was unsuccessful. Try manual start. <BR/><BR/>" + $FailedAsyncService)
}
else
{
## Calling Send_Mail function to notify.
Send_Email ("CRM Async Service Restarted.") ("System has detected that the following CRM Async Service has failed. System automatically tried restarting the service and it was successful. <BR/><BR/>" + $FailedAsyncService)
}
}
## Checking whether the Async Maintenance Service has failed.
if ($FailedAsyncMainteService -ne $NULL)
{
## Trying to start the failed Async Maintenance Service.
Start-Service -displayname "Microsoft Dynamics CRM Asynchronous Processing Service (maintenance)"
## Get all services which has a Name like MSCRMAsyncService$maintenance, Start Mode is Auto and service State is Running.
$AsyncMainteServiceStarted = Get-WmiObject Win32_Service | Where-Object {$_.Name -like 'MSCRMAsyncService$maintenance' -and $_.StartMode -eq 'Auto' -and $_.State -ne 'Running'} | Select-Object Name
## Checking the service to see whether it started.
if ($AsyncMainteServiceStarted -ne $NULL)
{
## Calling Send_Mail function to notify.
Send_Email ("CRM Async Service Failed.") ("System has detected that the following CRM Async Service has failed. System automatically tried restarting the service but it was unsuccessful. Try manual start. <BR/><BR/>" + $FailedAsyncMainteService)
}
else
{
## Calling Send_Mail function to notify.
Send_Email ("CRM Async Service Restarted.") ("System has detected that the following CRM Async Service has failed. System automatically tried restarting the service and it was successful. <BR/><BR/>" + $FailedAsyncMainteService)
}
}
}
## Calling the Check_Service function.
Check_Service