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" } }