### 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