How to Synchronously Run a Management Pack Task
Applies To: Operations Manager 2007 R2, Operations Manager 2007 SP1, System Center Operations Manager 2007
Operations Manager Management Pack tasks can run in either a synchronous or an asynchronous mode. When an SDK client runs a task in a synchronous mode, the task runs in the client's thread. This requires the client to delay until the task is complete.
Example
The following example demonstrates how to synchronously run a task to get the names of rules and monitors that are running on a specific agent-managed computer.
/// <summary>
/// Synchronously runs a task to get a list of
/// rules or monitors running on a specific agent-managed computer.
/// </summary>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Administration;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Monitoring;
using System.Xml;
using System.Text;
namespace SDKSamples
{
class Program
{
static void Main(string[] args)
{
ManagementGroup mg = new ManagementGroup("localhost");
Console.WriteLine("Synchronously running a Management Pack task...");
// Get the task.
string query = "DisplayName = 'Show running rules and monitors for this health service'";
MonitoringTaskCriteria taskCriteria = new MonitoringTaskCriteria(query);
ReadOnlyCollection<MonitoringTask> tasks =
mg.GetMonitoringTasks(taskCriteria);
MonitoringTask task = null;
if (tasks.Count == 1)
task = tasks[0];
else
throw new InvalidOperationException(
"Error! Expected one task with: " + query);
// Get the agent class.
query = "Name = 'Microsoft.SystemCenter.Agent'";
MonitoringClassCriteria criteria = new MonitoringClassCriteria(query);
ReadOnlyCollection<MonitoringClass> classes =
mg.GetMonitoringClasses(criteria);
if (classes.Count != 1)
throw new InvalidOperationException(
"Error! Expected one class with: " + query);
// Create a MonitoringObject list containing a specific agent (the
// target of the task).
string fullAgentName = "EnterFullyQualifiedAgentNameHere";
List<MonitoringObject> targets = new List<MonitoringObject>();
query = "DisplayName = '" + fullAgentName + "'";
MonitoringObjectCriteria targetCriteria =
new MonitoringObjectCriteria(query, classes[0]);
targets.AddRange(mg.GetMonitoringObjects(targetCriteria));
if (targets.Count != 1)
throw new InvalidOperationException(
"Error! Expected one target.");
// Use the default task configuration.
MonitoringTaskConfiguration config = new MonitoringTaskConfiguration();
// Run the task.
Console.WriteLine("Starting task \"" +
task.DisplayName + "\" on the following target: ");
foreach (MonitoringObject target in targets)
{
Console.WriteLine(target.DisplayName);
}
Console.WriteLine("Task started.");
ReadOnlyCollection<MonitoringTaskResult> results =
mg.ExecuteMonitoringTask(targets, task, config);
if (results.Count == 0)
throw new InvalidOperationException(
"Failed to return any results.");
// Display the task results.
int resultNo = 0;
foreach (MonitoringTaskResult res in results)
{
resultNo++;
if (res.Status == TaskStatus.Failed)
{
Console.WriteLine("Target #" + resultNo + " failed.");
Console.WriteLine("Reason: " + res.ErrorCode.Value);
}
else
{
Console.WriteLine("Target #" + resultNo + " succeeded.");
// Convert the task Output element from a string to XML.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(res.Output);
// Parse and display the output.
string xPathQry = @"/DataItem/Count";
System.Xml.XmlNode countNode = xmlDoc.SelectSingleNode(xPathQry);
Console.WriteLine("Target contains " + countNode.InnerText + " running rules or monitors.");
xPathQry = @"//Workflow";
System.Xml.XmlNodeList instanceList = xmlDoc.SelectNodes(xPathQry);
int cnt = 0;
foreach (System.Xml.XmlNode thisInstance in instanceList)
{
cnt++;
Console.WriteLine(cnt.ToString() + ". " + thisInstance.InnerText);
}
}
}
}
}
}
' Synchronously runs a task to get a list of
' rules or monitors running on a specific agent-managed computer.
Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports Microsoft.EnterpriseManagement
Imports Microsoft.EnterpriseManagement.Administration
Imports Microsoft.EnterpriseManagement.Common
Imports Microsoft.EnterpriseManagement.Configuration
Imports Microsoft.EnterpriseManagement.Monitoring
Imports System.Xml
Imports System.Text
Namespace SDKSamples
Class Program
Public Overloads Shared Function Main(ByVal args() As String) As Integer
Dim mg As ManagementGroup = New ManagementGroup("localhost")
Console.WriteLine("Synchronously running a Management Pack task...")
' Get the task.
Dim query As String = "DisplayName = 'Show running rules and monitors for this health service'"
Dim taskCriteria As MonitoringTaskCriteria = New MonitoringTaskCriteria(query)
Dim tasks As ReadOnlyCollection(Of MonitoringTask) = _
mg.GetMonitoringTasks(taskCriteria)
Dim task As MonitoringTask = Nothing
If (tasks.Count = 1) Then
task = tasks(0)
else
Throw New InvalidOperationException( _
"Error! Expected one task with: " & query)
End If
' Get the agent class.
query = "Name = 'Microsoft.SystemCenter.Agent'"
Dim criteria As MonitoringClassCriteria = New MonitoringClassCriteria(query)
Dim classes As ReadOnlyCollection(Of MonitoringClass) = _
mg.GetMonitoringClasses(criteria)
If (classes.Count <> 1) Then
Throw New InvalidOperationException( _
"Error! Expected one class with: " & query)
End If
' Create a MonitoringObject list containing a specific agent (the
' target of the task).
Dim fullAgentName As String = "EnterFullyQualifiedAgentNameHere"
Dim targets As List(Of MonitoringObject) = New List(Of MonitoringObject)()
query = "DisplayName = '" & fullAgentName & "'"
Dim targetCriteria As MonitoringObjectCriteria = _
New MonitoringObjectCriteria(query, classes(0))
targets.AddRange(mg.GetMonitoringObjects(targetCriteria))
If (targets.Count <> 1) Then
Throw New InvalidOperationException( _
"Error! Expected one target.")
End If
' Use the default task configuration.
Dim config As MonitoringTaskConfiguration = New MonitoringTaskConfiguration()
' Run the task.
Console.WriteLine("Starting task """ & _
task.DisplayName & """ on the following target: ")
For Each target As MonitoringObject In targets
Console.WriteLine(target.DisplayName)
Next
Console.WriteLine("Task started.")
Dim results As ReadOnlyCollection(Of MonitoringTaskResult) = _
mg.ExecuteMonitoringTask(targets, task, config)
If (results.Count = 0) Then
Throw New InvalidOperationException( _
"Failed to return any results.")
End If
' Display the task results.
Dim resultNo As Integer = 0
For Each res As MonitoringTaskResult In results
resultNo = resultNo + 1
If (res.Status = TaskStatus.Failed) Then
Console.WriteLine("Target #" & resultNo & " failed.")
Console.WriteLine("Reason: " & res.ErrorCode.Value)
Else
Console.WriteLine("Target #" & resultNo & " succeeded.")
' Convert the task Output element from a string to XML.
Dim xmlDoc As XmlDocument = New XmlDocument()
xmlDoc.LoadXml(res.Output)
' Parse and display the output.
Dim xPathQry As String = "/DataItem/Count"
Dim countNode As XmlNode = xmlDoc.SelectSingleNode(xPathQry)
Console.WriteLine("Target contains " & countNode.InnerText & " running rules or monitors.")
xPathQry = "//Workflow"
Dim instanceList As XmlNodeList = xmlDoc.SelectNodes(xPathQry)
Dim cnt As Integer = 0
For Each thisInstance As XmlNode In instanceList
cnt = cnt + 1
Console.WriteLine(cnt.ToString() & ". " & thisInstance.InnerText)
Next
End If
Next
End Function
End Class
End Namespace