How Do I: Access SCOM Properties Programmatically

For some background. The question that led to this post was in regard to being able to access properties that SCOM was discovering in order to detect config drift in some networking hardware. Normally when I get a question like this my first answer is don’t use SCOM for this–use OMS, SCCM, or some other tool designed specifically for this purpose. With that said, they had a specific use case that made sense, and SCOM was already collecting all the properties they cared about as part of a 3rd party Management Pack so the primary goal became giving the customer a better picture of where this data gets stored and the easiest way to access it.

First way of getting at discovered property data is via the OperastionsManager Database (The usual caveats about directly querying the OpsDB not being recommended or supported apply.)

There are tables called Dbo.MT which contain the various properties associated with a certain class of object.

prop01

If I look at something like SQL 2014 Databases I find the following: (There are more properties, but they get truncated off screen)

Select * from dbo.MT_Microsoft$SQLServer$2014$Database

prop02

To make this a little more meaningful we need to pick which tables we are interested in and join FullName from BaseManagedEntityID so we can understand which systems these databases are associated with. For this I wrote the following query:

SELECT

BME.FullName,

MT.DatabaseName_3AD1AB73_FD77_E630_3CDE_2CA224473213 As ‘DB Name’,

MT.DisplayName,

MT.DatabaseAutogrow_E32D36C4_7E11_62BE_D5B4_B77C841DCCA1 As ‘DB Autogrow’,

MT.RecoveryModel_772240AD_E512_377C_8986_E4F8369BDC21 As ‘DB RecoveryModel’,

MT.LogAutogrow_75D233F6_0569_DB26_0207_8894057F498C As ‘LogAutogrow’,

MT.Collation_4BC5C384_34F3_4C3F_A398_2298DBA85BCD As ‘Collation’,

MT.BaseManagedEntityId

FROM dbo.MT_Microsoft$SQLServer$2014$Database MT

JOIN dbo.BaseManagedEntity BME On BME.BaseManagedEntityID  = MT.BaseManagedEntityId

Which gives this output:

prop03

You could also get at similar data through the SDK via PowerShell (This would technically be the officially supported technique, though sometimes not as flexible as SQL). To do this you would use something like:

Import-Module OperationsManager

$WindowsServerClass= Get-SCOMClass -Name Microsoft.SQLServer.2014.Database

$ServerObjects = Get-SCOMClassInstance -Class $WindowsServerClass | Select Fullname, *.DatabaseName,*.RecoveryModel,*.DatabaseAutogrow,*.LogAutogrow,*.Collation

$ServerObjects

This will give you results that look as follows: (I just arbitrarily picked a few properties, there are more available that you can look at with either I get-member or | Select *

prop04

From there we can make things a little more readable with the following:

Import-Module OperationsManager

$WindowsServerClass= Get-SCOMClass -Name Microsoft.SQLServer.2014.Database

$ServerObjects = Get-SCOMClassInstance -Class $WindowsServerClass

$ServerObjectsB = $ServerObjects | Select *.DatabaseName, *.RecoveryModel, *.DatabaseAutogrow, *.LogAutogrow, *.Updateability, *.UserAccess, *.Collation, *.Owner, *.ResourcePool | FT

prop05

From there we started playing around with ways to quickly identify differences:

prop06

This is still a work in progress, but I figured I would share in case this can be of use to anyone.

The contents of this site are provided “AS IS” with no warranties, or rights conferred. Example code could harm your environment, and is not intended for production use. Content represents point in time snapshots of information and may no longer be accurate. (I work @ MSFT. Thoughts and opinions are my own.)