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);
}
//-------------------------------------------------------------------
&n