Powershell Service Checks – VMware edition

[powershell]
# be tidy – clear the screen 🙂
cls

# show a welcome message
write-host "VMware Service Status"
write-host "——————–"
write-host ""

function checkService ($serviceName, $machineName) {

# do some very basic error checking
if (($serviceName -eq $null) -or ($machineName -eq $null))
{
write-host "Service or machine name missing. Please correct and retry."
}
else
{
# use the .NET abilities of PowerShell to get a list of all services that match the service name we’re looking for
# note that we are checking both the short and display names, i.e. you can check for either
# e.g. "iisadmin" and "IIS Admin Service" will both work
$serviceResults = [System.ServiceProcess.ServiceController]::GetServices($machineName) | where{ (($_.name -eq $serviceName) -or ($_.displayname -eq $serviceName))}

# check to see if the results is an empty object
# if it is empty the requested service wasn’t found
if ($serviceResults -eq $null)
{
# the service wasn’t found so set the result to an empty string (it’s used later)
$isServiceFound = ""
}
else
{
# the service was found so get the service’s name
$isServiceFound = $serviceResults.name
}

# check to see if any service names were returned
if ($isServiceFound -eq "")
{
# the service wasn’t found
$resultDisplay = "Not found"
}
else
{
# the requested service was found so get its status
$serviceStatus = get-service $isServiceFound
$resultDisplay = $serviceStatus.status
}

# return the result of the service check
if ($resultDisplay -eq "Running")
{
# it is running so display an appropriate confirmation in normal text colour
write-host "$serviceName : " -noNewLine
write-host $resultDisplay
}
else
{
# the service isn’t running to display a warning in red text colour
write-host "$serviceName : " -noNewLine
write-host $resultDisplay -foregroundColor(‘red’)
Start-Service "$servicename"
Start-Sleep -s 45
$serviceResults2 = [System.ServiceProcess.ServiceController]::GetServices($machineName) | where{ (($_.name -eq $serviceName) -or ($_.displayname -eq $serviceName))}
$serviceStatus2 = get-service $isServiceFound
$resultDisplay2 = $serviceStatus2.status
$smtpServer = "exchange2010.www.alanrocks.com"
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)

$msg.From = "[email protected]"
$msg.To.Add("[email protected]")
$msg.Subject = "$serviceName Service ERROR"
$msg.Body = "Something Broke!!!!!"
$msg.Body += "`n `n$serviceName : $resultDisplay"
$msg.Body += "`n `n `n"
$msg.Body += "I have tried to start the service and "
if ($resultDisplay2 -eq "Running")
{
$msg.Body += "it is now running successfully"
$msg.Body += "`n $serviceName : $resultDisplay2"
Write-Host "I have tried to start the service $serviceName and is now running"
}
else
{
$msg.Body += "it is STILL NOT STARTED"
$msg.Body += "`n $serviceName : $resultDisplay2"
Write-Host "I have tried to start the service $serviceName and is STILL NOT running"
}

$smtp.Send($msg)
}
}
}

# this line dynamicaly loads the .NET assemblies into memory so they can be used by this script
$loadAssemblies = [System.Reflection.Assembly]::LoadWithPartialName(‘system.serviceprocess’)

# setup the list of services we want to check
# modify this array to suit your needs
$serviceList = "SQL Server (SQLEXP_VIM)", "VMware VirtualCenter Server", "VMware VirtualCenter Management Webservices"

# loop through the list of services and check then report on the status of each one
foreach ($serviceEntry in $serviceList)
{
# try and get the service’s status (if it exists)
checkService $serviceEntry ‘localhost’
}

# not important, just for clean-screen reasons again 🙂
write-host ""
[/powershell]