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;

        }       

    }

}