Improvements in SDK from Operations Manager 2007

I wanted to provide a high level overview of feature additions to the SDK since Operations Manager 2007 shipped. The items are in no particular order and will be discussed in more depth in subsequent posts.

Default Values for Properties

Types can define default values on properties. The default values need to be literals and are implemented using the default value column construct in SQL.

Required Properties

Types can now defined non-key required properties. Values for these properties will always be required during insertion unless the property has a default value, in which case that value will be used.

Auto-Increment Properties

Integer and string properties can be defined as auto-increment in a management pack. When instances of types that contain auto-increment properties are created in the SDK client, the client retrieves the next available value from the database and removes it from future use (whether or not the instance is committed). This value is then embedded in the property using a standard .Net format string with {0} replaced by the value from the database. As an example, this can be used to create unique, readable ticket numbers: “SR_{0}”.

Binary Properties

Binary properties have been added and are written and returned as streams. The stream is retrieved on demand and will not be brought back as part of normal instance retrieval.

Enumeration Properties

Management packs can define enumerations that can be used as property values in the instance space. These enumerations are hierarchal and extensible via other management packs.

Categories in Management Packs

Categories allow the association of an enumeration (as defined above) and a management pack element. An element can have an unlimited number of associated enumerations that act to categorize the element for various uses.

Type Extensions

Type extensions are an MP schema change to allow a derived type to be defined as an extension of its base type. The design is such that a user can add a property to a type, for all instances of that type. Thus, when someone imports a type extension, the system adds this type to all instances of the base type and all new instances will automatically be an instance of the type extension class, regardless of the data the discovery packet that discovered them contains. Type extensions can be explicitly added or updated on an instance, but cannot be removed without removing the entire instance.

Relationship Endpoints

Relationships now have sub-elements that represent the source and target endpoints. These endpoints can define cardinality value of 0, 1 and MaxInt. If max and min cardinality are both 1, it is enforced by the infrastructure, otherwise it is used as a hint to the UI and other consumers.

Instance History

The CMDB stores property and relationship changes for instances. They can be retrieved per instance from the SDK and are used by other components internally that rely on instance space changes.

Instance Change Subscriptions

Similar to the alert change subscriptions in OM, we now have an instance space change subscription data source that allows you to trigger other actions because on an instance space change. We use this to trigger WWF workflows.


A new concept in the type space, type projections allow you to define a hierarchal view over the type space that gets materialized on retrieval by the SDK client. This allows retrieval of logical instances that are composed of many instances and the relationships that join them together. The mechanism is used as the backing instance space definition for all forms and views in Service Manager; that is a view or form is bound to a particular projection.

SDK also have a lot of functionality built in to support this concept, including advanced query support over these definitions. For instance, you can define a projection that is an incident with its assigned to user and then query for all instances of this projection where to assigned to user is some particular user.

Object Templates

Object templates are essentially saved instances and projections defined in a management pack that can be used to create new instances or be applied to existing instances and set their values to those found in the template.

Type indexes

You can now define indexes on types in a management pack to help improve performance.

Criteria Improvements

Criteria has changed (we still support the old format as well) to be xml-based to remove ambiguity problems we had with the old model and to consolidate it with group calculation and subscription criteria. We’ve also enhanced criteria to support projection queries, containment queries and added an IN clause predicate. The new features are only available with the new xml format.

Full-Text Queries

Full-Text is supported for string and binary properties, with significant limitations in how the full-text query syntax can be leveraged within other criteria elements. Currently this is only being used for knowledge search within some limited scenarios.

Partial Instances

Users of the SDK can now specify which properties they want to get back when they retrieve instances. This functionality applies to all mechanisms of retrieving instances and is recommended to help with performance issues when dealing with large data sets.

Paging and Sorting

The SDK supports retrieving instances in a paged mode that returns some buffer worth of data on each remote call. This functionality should be combined with sorting that will allow for UI design that yields better performance.

Abstract Query Support

Abstract types are now supported within type-based queries, both for types and projections.

Security Enhancements

We’ve expanded the security model to support property level write granularity, group + type scoping on read and implied permissions based on the instance itself (i.e. the owner of an incident as some set of implied permissions on it).

Resource Support in Management Packs

Management packs can now have embedded resources (the file is msi-based) that separate large resources (reports, form binaries, etc) from the xml manifest of the management pack.

XPath Navigable Instance Space

With the introduction of projections it became important to have a friendlier way to traverse a large hierarchal instance on the client. To server that need projection instances and instances are both XPathNavigable.

Optimistic Concurrency on Instances

We support full-optimistic concurrency support, per instance.

Unification of CustomMonitoringObject and MonitoringObject

We’ve merged the two objects for a more consistent experience when working with the instance space in the SDK.

Comments (9)

  1. I’m trying to compile some samples from SDK, but getting following errors (compiling directly from RMS):

    The type or namespace name ‘EnterpriseManagement’ does not exist in the namespace ‘Microsoft’ (are you missing an assembly reference?)

    Here is the sample code below (sample):

    using System;

    using System.Collections.ObjectModel;

    using Microsoft.EnterpriseManagement;

    using Microsoft.EnterpriseManagement.Administration;

    using Microsoft.EnterpriseManagement.Configuration;

    using Microsoft.EnterpriseManagement.Monitoring;

    namespace SDKSamples


       class Program


           static void Main(string[] args)


               ManagementGroup mg = new ManagementGroup("localhost");

               // The criteria specifies that you want to collect

               // agents that were modified after 10/25/2006.

               AgentManagedComputerCriteria agentCriteria =

                   new AgentManagedComputerCriteria(

                   "LastModified >= ‘" +

                   new DateTime(2009, 05, 10).ToString("G") + "’");

               ManagementGroupAdministration administration =


               Console.WriteLine("Querying for data…");

               ReadOnlyCollection<AgentManagedComputer> agents =


               // Display information about each agent.

               foreach (AgentManagedComputer agent in agents)


                   Console.WriteLine("Agent name: " + agent.Name);

                   Console.WriteLine("IPAddress: " + agent.IPAddress);

                   Console.WriteLine("Health State: " + agent.HealthState);

                   Console.WriteLine("Version: " + agent.Version +






    Would you please redirect me here?

    Note: I’m big fan of your blog!


  2. Did you refer to the Microsoft.EnterpriseManagement.OperationsManager.dll and Microsoft.EnterpriseManagement.Common.dll? Both are found in the Program Files directory under SDK Binaries.

  3. Thank you for the response!

    I do have both dlls under SDK binaries (SCOM 2007 SP1). Using VS 2005 as editor, but ?:

    Why those errors when compiling from different directory? Does the code (C#) need to be compiled from SDK binaries?  

    Note: For starter …:)

  4. Your project needs to refer to those dlls in the references section. Did you do that?

  5. I did use following namespaces in the code:

    using System;

    using System.Collections.ObjectModel;

    using Microsoft.EnterpriseManagement;

    using Microsoft.EnterpriseManagement.Administration;

    using Microsoft.EnterpriseManagement.Configuration;

    using Microsoft.EnterpriseManagement.Monitoring;

    Is there different section to refer those dlls?

    Thanks again!

  6. Yeah, you have to add the DLL to your References section on the right hand side of the VS project.

  7. cknight says:

    Where can I get the updated SDK?  Will it work with SP1?  The download site still shows the old version, and the online SDK docs don’t reflect the "Unification of CustomMonitoringObject and MonitoringObject".

  8. It is available with Service Manager 2010 Beta 1 and with Server Manager 2010 Beta 2 which will ship later this year. It will not make it into Operations Manager until the next release (beyond R2).

Skip to main content