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;
}
}
}
Comments
- Anonymous
October 26, 2007
PingBack from http://msdnrss.thecoderblogs.com/2007/10/26/creating-a-unit-monitor-using-the-sdk/ - Anonymous
August 21, 2008
Check out Boris Yanushpolsky's blog ( http://blogs.msdn.com/boris_yanushpolsky ). Boris is an SCOM