This is a continuation of a Data Center Automation series of posts that I have been working on with Anders Bengtsson. Here are the first nine posts in this series:

Creating Management Packs in SCOM 2012 with PowerShell
Creating Performance Collection Rules in SCOM 2012 with PowerShell
Creating Event Based Alerting Rules in SCOM 2012 with PowerShell
Enabling or Disabling Workflows in SCOM 2012 with PowerShell
Deleting Workflows in SCOM 2012 with PowerShell
Creating Groups in SCOM 2012 with PowerShell
Adding References to MPs in SCOM 2012 with PowerShell
Modifying Explicit Group Membership in SCOM 2012 with PowerShell
Get Parameters that can be Overridden in SCOM 2012 with PowerShell

As of this post this script is not included as an activity in the Operations Manager Admin Integration Pack but will be in the next version.

The purpose of this script is to get all overrides that are applied to the workflow that is passed as a parameter to this script. This script supports rules, monitors, discoveries, diagnostics, and recoveries.

To get a list of workflows for each type you can run the following commands:

Get-SCOMRule | select name
Get-SCOMMonitor | select name
Get-SCOMDiscovery | select name
Get-SCOMDiagnostic | select name
Get-SCOMRecovery | select name

Syntax:

.\GetOverrides.ps1 –ManagementServer ‘om01.contoso.com’ –WorkflowID ‘custom.example.test.rule.myrule’

Parameters:

Name Description
ManagementServer Name of MS to connect to
WorkflowID ID of the rule, monitor, discovery, diagnostic, or recovery that you want the available overrides for. You can use the output of the PowerShell cmdlets I listed above. This script supports only a single workflow name at this time.

Output:

Name Description
OverrideID The id of the override
OverrideMP The management pack that the override exists in
OverrideMPDisplayName The friendly name of the management pack that the override exists in
OverrideType The type of the override found (discovery, rule, etc…)
OverrideProperty The property that the override applies to. This only applies to the hard coded properties specific to the type of workflow passed.
OverrideModule If the parameter that the override applies to is a configuration parameter then this is the unique name of the module that the override is defined
OverrideParameter If the parameter that the override applies to is a configuration parameter then this is the name of the parameter.
OverrideValue The property or configuration value of the override
WorkflowID The id of the rule, discovery, monitor, etc… that the override applies to
WorkflowName The friendly name of the rule, discovery, monitor, etc… that the override applies to
WorkflowMP The management pack that the workflow, in which the override applies to, exists in
WorkflowMPDisplayName The friendly name that the management pack that the rule, monitor, recovery, etc… that the override applies to exists in
WorkflowType The type of the workflow that the override applies to (discovery, diagnostic, etc…)
ContextID The id of the class / group that the override is applied to
ContextName The friendly name of the class / group that the override is applied to
ContextMP The management pack that the class / group, in which the override is applied to, exists
ContextMPDisplayName The friendly name of the management pack that the class / group, in which the override is applied to, exists
ContextInstanceGUID If the override is also applied to an instance of a class then this is the GUID of that instance.
ContextInstanceNameAndPath If the override is also applied to an instance of a class then this is the DisplayName and Path of that instance
Enforced Whether or not the override has the Enforced property set
1 Param( 2 [parameter(Mandatory=$true)] 3 $ManagementServer, 4 [parameter(Mandatory=$true)] 5 $WorkflowID 6 ) 7 8 Write-Host "Version 1.0" 9 Write-Host "ManagementServer:"$ManagementServer 10 Write-Host "WorkflowID:"$WorkflowID 11 12 function GetSCOMManagementGroup 13 { 14 param($ms) 15 try 16 { 17 $mg = New-Object Microsoft.EnterpriseManagement.ManagementGroup($ms) 18 } 19 catch 20 { 21 Write-Host "Failed to Connect to SDK, Exiting:"$ms -ForegroundColor Red 22 Write-Host $_.Exception.Message -ForegroundColor Yellow 23 exit 24 } 25 return $mg 26 } 27 28 function GetWorkflowFromOverride 29 { 30 param($mg, $override) 31 32 switch ($override.XmlTag.ToString()) 33 { 34 'DiscoveryPropertyOverride' { $property = 'Discovery' } 35 'DiscoveryConfigurationOverride' { $property = 'Discovery' } 36 'RulePropertyOverride' { $property = 'Rule' } 37 'RuleConfigurationOverride' { $property = 'Rule' } 38 'MonitorPropertyOverride' { $property = 'Monitor' } 39 'MonitorConfigurationOverride' { $property = 'Monitor' } 40 'DiagnosticPropertyOverride' { $property = 'Diagnostic' } 41 'DiagnosticConfigurationOverride' { $property = 'Diagnostic' } 42 'RecoveryPropertyOverride' { $property = 'Recovery' } 43 'RecoveryConfigurationOverride' { $property = 'Recovery' } 44 'SecureReferenceOverride' { $property = 'SecureReference' } 45 'CategoryOverride' { $property = 'Category' } 46 } 47 48 return $workflow 49 } 50 51 function GetWorkflow 52 { 53 param($mg, $wfID) 54 55 $criteria = [string]::Format("Name = '{0}'", $wfID) 56 $wfTypes = ('recovery','diagnostic','recovery','monitor','rule','discovery') 57 $bFound = $false 58 59 foreach ($wfType in $wfTypes) 60 { 61 if ($bFound) {break} 62 switch ($wfType) 63 { 64 'discovery' { $workflow = GetDiscovery -mg $mg -criteria $criteria; if ($workflow -ne $null) {$bFound = $true; break} } 65 'rule' { $workflow = GetRule -mg $mg -criteria $criteria; if ($workflow -ne $null) {$bFound = $true; break} } 66 'monitor' { $workflow = GetMonitor -mg $mg -criteria $criteria; if ($workflow -ne $null) {$bFound = $true; break} } 67 'recovery' { $workflow = GetRecovery -mg $mg -criteria $criteria; if ($workflow -ne $null) {$bFound = $true; break} } 68 'diagnostic' { $workflow = GetDiagnostic -mg $mg -criteria $criteria; if ($workflow -ne $null) {$bFound = $true; break} } 69 } 70 } 71 72 if ($workflow -eq $null) 73 { 74 Write-Host "Unable to Find Workflow, Exiting"$wfID -ForegroundColor Red 75 Write-Host $_.Exception.Message -ForegroundColor Yellow 76 exit 77 } 78 79 return $workflow 80 } 81 82 function GetWorkflowOverrides 83 { 84 param($guid, $overrides) 85 86 $wOverrides = New-Object System.Collections.ArrayList 87 88 foreach ($override in $overrides) 89 { 90 $property = GetOverrideType -override $override 91 92 $oGUID = ($override.$property.ToString()).Split("=")[1] 93 94 if ($guid -eq $oGUID) 95 { 96 [void]$wOverrides.Add($override) 97 } 98 } 99 100 return $wOverrides 101 } 102 103 function GetInstance 104 { 105 param($mg, $guid) 106 107 $instance = $mg.GetMonitoringObject($guid) 108 $instance = $instance.DisplayName + "|" + $instance.Path 109 110 return $instance 111 } 112 113 function GetClass 114 { 115 param($mg, $id) 116 117 $class = $mg.GetMonitoringClass($id) 118 119 return $class 120 } 121 122 function GetDiscovery 123 { 124 param($mg, $criteria) 125 $searchCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitoringDiscoveryCriteria($criteria) 126 $discovery = $mg.GetMonitoringDiscoveries($searchCriteria)[0] 127 return $discovery 128 } 129 130 function GetRule 131 { 132 param($mg, $criteria) 133 $searchCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitoringRuleCriteria($criteria) 134 $rule = $mg.GetMonitoringRules($searchCriteria)[0] 135 return $rule 136 } 137 138 function GetMonitor 139 { 140 param($mg, $criteria) 141 $searchCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitorCriteria($criteria) 142 $monitor = $mg.GetMonitors($searchCriteria)[0] 143 return $monitor 144 } 145 146 function GetDiagnostic 147 { 148 param($mg, $criteria) 149 $searchCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitoringDiagnosticCriteria($criteria) 150 $diagnostic = $mg.GetMonitoringDiagnostics($searchCriteria)[0] 151 return $diagnostic 152 } 153 154 function GetRecovery 155 { 156 param($mg, $criteria) 157 $searchCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitoringRecoveryCriteria($criteria) 158 $recovery = $mg.GetMonitoringRecoveries($searchCriteria)[0] 159 return $recovery 160 } 161 162 function GetAllOverrides 163 { 164 param($mg) 165 $criteria = ([string]::Format("Name like '%'")) 166 $searchCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitoringOverrideCriteria($criteria) 167 $overrides = $MG.GetMonitoringOverrides($searchCriteria) 168 return $overrides 169 } 170 171 function GetOverrideType 172 { 173 param($override) 174 175 switch ($override.XmlTag.ToString()) 176 { 177 'DiscoveryPropertyOverride' { $property = 'Discovery' } 178 'DiscoveryConfigurationOverride' { $property = 'Discovery' } 179 'RulePropertyOverride' { $property = 'Rule' } 180 'RuleConfigurationOverride' { $property = 'Rule' } 181 'MonitorPropertyOverride' { $property = 'Monitor' } 182 'MonitorConfigurationOverride' { $property = 'Monitor' } 183 'DiagnosticPropertyOverride' { $property = 'Diagnostic' } 184 'DiagnosticConfigurationOverride' { $property = 'Diagnostic' } 185 'RecoveryPropertyOverride' { $property = 'Recovery' } 186 'RecoveryConfigurationOverride' { $property = 'Recovery' } 187 'SecureReferenceOverride' { $property = 'SecureReference' } 188 'CategoryOverride' { $property = 'Category' } 189 } 190 191 return $property 192 } 193 194 function GetFormattedOverrides 195 { 196 param($mg, $overrides, $workflow) 197 198 $formattedOverrides = New-Object System.Collections.ArrayList 199 200 foreach ($override in $overrides) 201 { 202 $class = GetClass -mg $MG -id $override.Context.ToString().Split("=")[1] 203 $property = GetOverrideType -override $override 204 if ($override.ContextInstance) {$iValue = GetInstance -mg $mg -guid $override.ContextInstance} else {$iValue = 'Not Applicable'} 205 if ($override.ContextInstance) {$gValue = $override.ContextInstance} else {$gValue = 'Not Applicable'} 206 if ($override.Property) {$pValue = $override.Property} else {$pValue = 'Not Applicable'} 207 if ($override.Module) {$mValue = $override.Module} else {$mValue = 'Not Applicable'} 208 if ($override.Parameter) {$paValue = $override.Parameter} else {$paValue = 'Not Applicable'} 209 210 $o = New-Object PSObject -Property @{ 211 OverrideID = $override.Name 212 OverrideMP = $override.GetManagementPack().Name 213 OverrideMPDisplayName = $override.GetManagementPack().DisplayName 214 OverrideType = $override.XmlTag 215 OverrideProperty = $pValue 216 OverrideModule = $mValue 217 OverrideParameter = $paValue 218 OverrideValue = $override.Value 219 WorkflowID = $workflow.Name 220 WorkflowName = $workflow.DisplayName 221 WorkflowMP = $workflow.GetManagementPack().Name 222 WorkflowMPDisplayName = $workflow.GetManagementPack().DisplayName 223 WorkflowType = $property 224 ContextID = $class.Name 225 ContextName = $class.DisplayName 226 ContextMP = $class.GetManagementPack().Name 227 ContextMPDisplayName = $class.GetManagementPack().DisplayName 228 ContextInstanceGUID = $gValue 229 ContextInstanceNameAndPath = $iValue 230 Enforced = $override.Enforced 231 } 232 [void]$formattedOverrides.Add($o) 233 } 234 235 return $formattedOverrides 236 } 237 238 #Connect to SCOM Management Group 239 $MG = GetSCOMManagementGroup -ms $ManagementServer 240 241 #Get workflow 242 $Workflow = GetWorkflow -mg $MG -wfID $WorkflowID 243 244 #Get all overrides in management group 245 $Overrides = GetAllOverrides -mg $MG 246 247 #Get all overrides applied to the workflow 248 $WorkflowOverrides = GetWorkflowOverrides -guid $Workflow.Id -overrides $Overrides 249 #$WorkflowOverrides 250 251 #Get formatted overrides 252 $WorkflowOverridesFormatted = GetFormattedOverrides -mg $MG -overrides $WorkflowOverrides -workflow $Workflow 253 254 #Print Output 255 $WorkflowOverridesFormatted | Format-List -Property OverrideID, OverrideMP, OverrideMPDisplayName, OverrideType, OverrideProperty, OverrideModule, OverrideParameter, OverrideValue, WorkflowID, WorkflowMP, WorkflowMPDisplayName, WorkflowType, ContextID, ContextName, ContextMP, ContextMPDisplayName, ContextInstanceGUID, ContextInstanceNameAndPath, Enforced