Monitoring a Windows Service running state is a common request at my work, and therefor a obvious thing to automate and win back some free time. Thanks to the MPTool PowerShell module this can easily done with four lines of PowerShell
First you need a management pack to place it in, either use a existing or create a new. In this example we will place all resources, class, discovery and monitor, in the same management pack, for more complex management packs you will usually split into separate management packs.
New-MPToolManagementPack -ManagementServerFQDN scomms01.cloudmechanic.net ` -ManagementPackName "CM.MyApp.ServiceMonitoring" ` -ManagementPackDisplayName "CM MyApp Service Monitoring" ` -ManagementPackDescription "Contains monitor for MyApp Windows service Monitor"
Once you have a management pack to place the monitor in, you need a class for the specific Windows service, you don’t need to add any properties for just basic service monitoring since the name of the Windows service cannot exist more than once on a Windows computer.
New-MPToolLocalApplicationClass -ManagementServerFQDN scomms01.cloudmechanic.net ` -ManagementPackName "CM.MyApp.ServiceMonitoring" ` -ClassName "CM.MyApp.WindowsService" ` -ClassDisplayName "CM MyApp Windows Service" ` -ClassDescription "CM MyApp Windows Service - Created with MPTool"
We now have a class for our Windows service and we can then go ahead and create the discovery to find where the service is existing. All Windows Services has a key under HKLM:SYSTEM\CurrentControlSet\Services\[NameOfTheService] so this can be used to discover the service. Note that this should be the service name and not the display name.
New-MPToolFilteredRegistryDiscovery -ManagementServerFQDN scomms01.cloudmechanic.net ` -ManagementPackName "CM.MyApp.ServiceMonitoring" ` -DiscoveryName "CM.MyApp.WindowsService.Discovery" ` -TargetClassName "Microsoft.Windows.Computer" ` -RegistryPath "SYSTEM\CurrentControlSet\Services\MyApp\" ` -DiscoveryClassName "CM.MyApp.WindowsService" ` -IntervalSeconds 300
Now the final step is to create a monitor for the discovered instances of the Windows service. Here you simply just need to target the newly created class, select the state of the alert if it triggered, Error or Warning, and last again defined the name of the Windows service to monitor the state of.
New-MPToolWindowsServiceMonitor -ManagementServerFQDN scomms01.cloudmechanic.net ` -ManagementPackName "CM.MyApp.ServiceMonitoring" ` -TargetClassName "CM.MyApp.WindowsService" ` -UnhealthyState "Error" ` -ServiceName "MyApp"
Of course now we want to put it all together in a script that we can use for self-service scenarios! I have created one example and placed my GitHub for MPTool.