Skripta za provjeru Exchange Servisa

Imao sam čudno iskustvo s Exchange 2013 poslužiteljom da su mi se znali zaustaviti neki servisi te bi prestali dolazni mailovi. Problem je sto se tako nešto ne uoči odmah. Jednostavno rješenje je skripta koja ih provjerava, starta i šalje obavijest na email o statusu servisa.

Prvo smo napisali funkciju koja se poziva da bi se poslao E-mail korisniku o statusu servisa. Funkcija izgleda ovako:

 

function sendMail($subject, $body) {

     Write-Host "Sending Email"

     #SMTP server name
     $smtpServer = "FQDN ili IP mail posluzitelja"

     #Creating a Mail object
     $msg = new-object Net.Mail.MailMessage

     #Creating SMTP server object
     $smtp = new-object Net.Mail.SmtpClient($smtpServer, 25)

     #Email structure
     $msg.From = "Mail FROM Adresa"
     $msg.ReplyTo = "Mail ReplyTO Adresa"
     $msg.To.Add("Mail TO Adresa")
     $msg.subject = $subject
     $msg.body = $body

     #Sending email
     $smtp.Send($msg)

}

Zatim je potrebno kreirati datoteku CSV formata. U navedenoj datoteci se u prvom polju nalazi “Name“, a u nastavku nabrojimo imena windows servisa koje želimo provjeravati.

Dio skripte koji nam sluzi za dohvat popisa servisa iz datoteke, npr. Services.txt:

 

# Get service details from a file
# Name
$FileLocation = "D:\Temp\Services.txt" #Change to Service.txt location
$services = Import-CSV $FileLocation
$date = Get-Date

Primjer datoteke za Microsoft Exchange 2013 servise:

Name
MSExchangeADTopology
MSExchangeDagMgmt
MSExchangeDiagnostics
MSExchangeEdgeSync
MSExchangeFrontEndTransport
MSExchangeHM
MSExchangeIS
MSExchangeMailboxAssistants
MSExchangeMailboxReplication
MSExchangeDelivery
MSExchangeSubmission
MSExchangeRepl
MSExchangeRPC
MSExchangeFastSearch
HostControllerService
MSExchangeServiceHost
MSExchangeThrottling
MSExchangeTransport
MSExchangeTransportLogSearch
MSExchangeUM
MSExchangeUMCR

Zatim slijedi skripta koja se pokreće automatski putem Task Scheduler-a. Skripta izgleda ovako:

foreach ($service in $services)
{
       $srv = Get-Service -Name $service.Name | Where-Object {$_.status -eq "running"}
       IF ($srv -eq $NULL) 
       {
              Write-Host "SERVICE STOPPED; TRYING TO START " $service.Name " ..."
              sendMail -subject "SERVICE ALERT - " $service.Name " !!" -body "Service " $service.Name " stopped; trying to start `r`n`r`nTIME OF SERVICE RESTART: $date" #Calling Function
              Start-Service -Name $service.Name

              $srv = Get-Service -Name $service.Name | Where-Object {$_.status -eq "running"}
              IF ($srv -eq $NULL) 
              {
                     Write-Host "FAILED TO START " $service.Name " SERVICE"
                     sendMail -subject "SERVICE ALERT - " $service.Name " !!" -body "FAILED TO START " $service.Name " SERVICE `r`n`r`nTIME OF FAILURE: $date" #Calling Function        
              }
              ELSE
              {
                     Write-Host "Service " $service.Name " started"
                     sendMail -subject "SERVICE ALERT " - $service.Name " !!" -body "Service " $service.Name " started `r`n`r`nTIME OF SERVICE RESTART: $date" #Calling Function
              }
       }
       ELSE
       {
              Write-Host "SERVICE " $service.Name " ALREADY RUNNING"
       }
}

 

Ovdije mozete Copy/Paste cijelu skriptu:

function sendMail($subject, $body) {

     Write-Host "Sending Email"

     #SMTP server name
     $smtpServer = "FQDN ili IP mail posluzitelja"

     #Creating a Mail object
     $msg = new-object Net.Mail.MailMessage

     #Creating SMTP server object
     $smtp = new-object Net.Mail.SmtpClient($smtpServer, 25)

     #Email structure
     $msg.From = "Mail FROM Adresa"
     $msg.ReplyTo = "Mail ReplyTO Adresa"
     $msg.To.Add("Mail TO Adresa")
     $msg.subject = $subject
     $msg.body = $body

     #Sending email
     $smtp.Send($msg)

}

# Get service details from a file
# Name
$FileLocation = "D:\Temp\Services.txt" #Change to Service.txt location
$services = Import-CSV $FileLocation
$date = Get-Date

foreach ($service in $services)
{
       $srv = Get-Service -Name $service.Name | Where-Object {$_.status -eq "running"}
       IF ($srv -eq $NULL) 
       {
              Write-Host "SERVICE STOPPED; TRYING TO START " $service.Name " ..."
              sendMail -subject "SERVICE ALERT - " $service.Name " !!" -body "Service " $service.Name " stopped; trying to start `r`n`r`nTIME OF SERVICE RESTART: $date" #Calling Function
              Start-Service -Name $service.Name

              $srv = Get-Service -Name $service.Name | Where-Object {$_.status -eq "running"}
              IF ($srv -eq $NULL) 
              {
                     Write-Host "FAILED TO START " $service.Name " SERVICE"
                     sendMail -subject "SERVICE ALERT - " $service.Name " !!" -body "FAILED TO START " $service.Name " SERVICE `r`n`r`nTIME OF FAILURE: $date" #Calling Function        
              }
              ELSE
              {
                     Write-Host "Service " $service.Name " started"
                     sendMail -subject "SERVICE ALERT " - $service.Name " !!" -body "Service " $service.Name " started `r`n`r`nTIME OF SERVICE RESTART: $date" #Calling Function
              }
       }
       ELSE
       {
              Write-Host "SERVICE " $service.Name " ALREADY RUNNING"
       }
}

 

Leave a Reply