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.

Visual Basic  Copy Code
' 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
C#  Copy Code
/// <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);
				}
			}
		}
	}
}
}

See Also


Send comments about this topic to Microsoft.