Creating NT Service unit monitor using the SDK

This came up several times so I decided to write a blog post on how you can create a unit monitor using the SDK. I will try post a PS script that does the same thing in the next several days.

using System;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Text;

using Microsoft.EnterpriseManagement;

using Microsoft.EnterpriseManagement.Administration;

using Microsoft.EnterpriseManagement.Common;

using Microsoft.EnterpriseManagement.Configuration;

using Microsoft.EnterpriseManagement.Monitoring;

namespace SDKSamples

{

    class Program

    {

        //-------------------------------------------------------------------

        static void Main(string[] args)

        {

            ManagementGroup mg;

            ManagementPack mp;

            MonitoringClass monitoringClass;

            MonitoringClassCriteria monitoringClassCriteria;

            ManagementPackUnitMonitor serviceMonitor;

            ManagementPackUnitMonitorType serviceMonitorType;

            mg = new ManagementGroup("localhost");

            mp = mg.GetManagementPacks("SampleManagementPack")[0];

            monitoringClassCriteria = new MonitoringClassCriteria("DisplayName='Windows Server 2003 Operating System'");

            monitoringClass = mg.GetMonitoringClasses(monitoringClassCriteria)[0];

            serviceMonitorType = mg.GetUnitMonitorTypes("Microsoft.Windows.CheckNTServiceStateMonitorType")[0];

serviceMonitor = new ManagementPackUnitMonitor(mp, "SampleServiceMonitor",

            ManagementPackAccessibility.Internal);

           

            serviceMonitor.DisplayName = "Sample Service Monitor";

           

            serviceMonitor.TypeID = serviceMonitorType;

            serviceMonitor.Target = monitoringClass;

            ConfigureAlertSettings(serviceMonitor,serviceMonitorType,mp);

           

           ConfigureHealthStates(serviceMonitor, serviceMonitorType);

           

            SpecifyMonitorConfiguration(serviceMonitor);

            SpecifyParentMonitor(serviceMonitor, mg);

            mp.Verify();

           

            //Save the changes into the management pack.

            mp.AcceptChanges();

        }

        private static void SpecifyParentMonitor(

            ManagementPackUnitMonitor serviceMonitor,

            ManagementGroup mg

            )

        {

            ManagementPackAggregateMonitor parentMonitor;

            MonitorCriteria monitorCriteria;

            monitorCriteria = new MonitorCriteria("Name='System.Health.AvailabilityState'");

            parentMonitor = (ManagementPackAggregateMonitor)mg.GetMonitors(monitorCriteria)[0];

            serviceMonitor.ParentMonitorID = parentMonitor;

        }

        //-------------------------------------------------------------------

        private static void SpecifyMonitorConfiguration(

            ManagementPackUnitMonitor serviceMonitor

            )

        {

            string monitorConfig;

            monitorConfig = @"<ComputerName>$Target/Host/Property[Type=""Windows!Microsoft.Windows.Computer""]/NetworkName$</ComputerName>

                              <ServiceName>Alerter</ServiceName>";

           

            serviceMonitor.Configuration = monitorConfig;

        }

        //-------------------------------------------------------------------

        private static void ConfigureHealthStates(

            ManagementPackUnitMonitor serviceMonitor,

            ManagementPackUnitMonitorType serviceMonitorType

            )

        {

            ManagementPackUnitMonitorOperationalState healthyState;

            ManagementPackUnitMonitorOperationalState errorState;

            healthyState = new ManagementPackUnitMonitorOperationalState(serviceMonitor, "Success");

            errorState = new ManagementPackUnitMonitorOperationalState(serviceMonitor, "Error");

            healthyState.HealthState = HealthState.Success;

            healthyState.MonitorTypeStateID = "Running";

           

            errorState.HealthState = HealthState.Error;

            errorState.MonitorTypeStateID = "NotRunning";

            serviceMonitor.OperationalStateCollection.Add(healthyState);

            serviceMonitor.OperationalStateCollection.Add(errorState);

        }

        //-------------------------------------------------------------------

        private static void ConfigureAlertSettings(

            ManagementPackUnitMonitor serviceMonitor,

            ManagementPackUnitMonitorType unitMonitorType,

            ManagementPack mp

            )

        {

            serviceMonitor.AlertSettings = new ManagementPackMonitorAlertSettings();

            serviceMonitor.AlertSettings.AlertOnState = HealthState.Error;

            serviceMonitor.AlertSettings.AutoResolve = true;

            serviceMonitor.AlertSettings.AlertPriority = ManagementPackWorkflowPriority.Normal;

            serviceMonitor.AlertSettings.AlertSeverity = ManagementPackAlertSeverity.Error;

            serviceMonitor.AlertSettings.AlertParameter1 = @"$Target/Host/Property[Type=""Windows!Microsoft.Windows.Computer""]/NetworkName$"; //this points to the computer name

            ManagementPackStringResource alertMessage;

           

            alertMessage = new ManagementPackStringResource(mp, "SampleAlertMessage");

            alertMessage.DisplayName = "The Alerter service is stopped";

            alertMessage.Description = "The Alerter service is stopped on computer {0}.";

            serviceMonitor.AlertSettings.AlertMessage = alertMessage;

        }

    }

}