Have realised my first attempt at using NRPE to monitor Windows services via WMI is in fact badly thought out and badly done. This is what happens when companies want everything yesterday and rush things :o(
Having thought about it, the following has come to mind:
The service string to check should not be hard coded into the script. Otherwise we would need x1 script per service to check (i.e. lots !). The service string should be a variable that we can pass to the script as an argument at run time.
And, we can only check one service at a time with this script. Therefore, placing the service name into an array is whaaaayyy overkill. Will simply replace the array with a single string variable.
This in mind, here’s the revised version of the check script
strComputer = "."
'list services to monitor, comma seperated, inside quotes
strService = Wscript.Arguments.Item(0)
'connect using standard monkier
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
'get an array containing all services
Set objItems = objWMIService.ExecQuery ("Select * from Win32_Service")
'for each service compare it’s display name to the current one we are looking for
For each objService in ObjItems
'if we get a service display name match
If objService.DisplayName = strService Then
'display the current service along with it’s current state
'wscript.echo "service name = " & objService.DisplayName & " currently :: " & objService.State
If objService.State = "Running" Then
'If the service is running return exit code 0 = ok
Wscript.Echo "SERVICE STATUS: OK"
Wscript.Quit(0)
Else
'otherwise return non 0 = error = fire alert hopefully
Wscript.Echo "SERVICE STATUS: Critical"
Wscript.Quit(2)
End if
End if
Next
And the command to add to the nrpe.cfg file will now need a parameter adding to the end like so (note the quote marks “” around the $ARG1$ parameter. This is in case our variable has spaces in it !!).
command[check_windows_service]=cscript.exe //T:30 //NoLogo "C:\Program Files (x86)\NRPE_NT\libexec\check_windows_service.vbs" "$ARG1$"
The command.cfg file will need a command definition in it like this
# 'check_windows_service' command definition (using NRPE)
define command{
command_name check_windows_service
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -t 60 -p 5666 -c check_windows_service -a $ARG1$
}
And finally, in services.cfg, a service check section using the command, like this
define service{
service_description Check Windows Awesome Service
servicegroups cust-windows
host_name windows_server_1
check_command check_windows_service!"Some Windows Service"
use generic-service
}
But we can now use the same script to check other services like this
define service{
service_description Check Windows Awesome Service
servicegroups cust-windows
host_name windows_server_1
check_command check_windows_service!"Some Windows Service"
use generic-service
}
define service{
service_description Check Windows Spooler Service
servicegroups cust-windows
host_name windows_server_1
check_command check_windows_service!"Print Spooler"
use generic-service
}
Second time’s a charm. At least I got to go back and correct my horrible (but technically working) mistake !
Next stop, monitoring for running processes by their executable name in the process list…….
