OpsMgr 2012 Self Maintenance Create Group Health Rollup Write Action

OpsMgr.2012.Self.Maintenance.Create.Group.Health.Rollup.Dependency.Monitors.WA (WriteActionModuleType)

Write Action module for creating group rollup dependency monitors.

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
InputTypeSystem.BaseData

Member Modules:

ID Module Type TypeId RunAs 
Script WriteAction Microsoft.Windows.PowerShellWriteAction Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
Algorithmstring$Config/Algorithm$Health Rollup PolicyPossible Values: 'WorstOf', 'Percentage' and 'BestOf'
Percentageint$Config/Percentage$Worst state of the percentage in healthy stateOnly used when Health Rollup Policy is configured as 'Percentage'
MemberUnavailablestring$Config/MemberUnavailable$Member Unavailable Rollup AsPossible values: 'Uninitialized','Success ','Warning','Error'
MemberInMaintenancestring$Config/MemberInMaintenance$Member in Maintenance Mode Rollup AsOptional. Possible values: 'Uninitialized','Success ','Warning','Error'
ManagementPackNamestring$Config/ManagementPackName$Management Pack NameUnsealed Management Pack to store rollup dependency monitors. Only required when the group is defined in a sealed MP.
IncreaseMPVersionbool$Config/IncreaseMPVersion$Increase Management Pack version by 0.0.0.1Boolean value. Select true if the version of the unsealed MP need to increase by 0.0.0.1
TimeoutSecondsint$Config/TimeoutSeconds$Script Timeout in SecondsTimeout value in seconds for the script used by the task.

Source Code:

<WriteActionModuleType ID="OpsMgr.2012.Self.Maintenance.Create.Group.Health.Rollup.Dependency.Monitors.WA" Accessibility="Internal" Batching="false">
<Configuration>
<IncludeSchemaTypes>
<SchemaType>OpsMgr.2012.Self.Maintenance.Health.State.SchemaType</SchemaType>
</IncludeSchemaTypes>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TargetId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" maxOccurs="1" name="Algorithm">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="BestOf"/>
<xsd:enumeration value="WorstOf"/>
<xsd:enumeration value="Percentage"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Percentage" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="MemberUnavailable" type="HealthStateType"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="MemberInMaintenance" type="HealthStateType"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="ManagementPackName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IncreaseMPVersion" type="xsd:boolean"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="Algorithm" Selector="$Config/Algorithm$" ParameterType="string"/>
<OverrideableParameter ID="Percentage" Selector="$Config/Percentage$" ParameterType="int"/>
<OverrideableParameter ID="MemberUnavailable" Selector="$Config/MemberUnavailable$" ParameterType="string"/>
<OverrideableParameter ID="MemberInMaintenance" Selector="$Config/MemberInMaintenance$" ParameterType="string"/>
<OverrideableParameter ID="ManagementPackName" Selector="$Config/ManagementPackName$" ParameterType="string"/>
<OverrideableParameter ID="IncreaseMPVersion" Selector="$Config/IncreaseMPVersion$" ParameterType="bool"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="Script" TypeID="Windows!Microsoft.Windows.PowerShellWriteAction">
<ScriptName>InstanceGroupRollupTask.ps1</ScriptName>
<ScriptBody><Script>PARAM (
[Parameter(Mandatory=$true)][String]$TargetId,
[Parameter(Mandatory=$true)][String]$Algorithm,
[Parameter(Mandatory=$false)][Int]$Percentage,
[Parameter(Mandatory=$false)][String]$MemberUnavailable,
[Parameter(Mandatory=$false)][String]$MemberInMaintenance,
[Parameter(Mandatory=$false)][String]$ManagementPackName,
[Parameter(Mandatory=$false)][string]$IncreaseMPVersion
)
#Parameter validation - since [ValidateScript] cannot be used here
#Percentage must be specified if Algorithm is set to "Percentage"
If ($Algorithm -ieq "percentage")
{
if ($Percentage -lt 1 -or $Percentage -gt 100)
{
Write-Error "Algorithm is set as 'Percentage' but the Percentage value specified is not valid. The percentage must be greater than 0 and less than 100"
Exit 1
}
}

#Connect to MG
#Load OpsMgr 2012 SDK DLLs
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.EnterpriseManagement.Core') | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.EnterpriseManagement.OperationsManager') | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.EnterpriseManagement.Runtime') | Out-Null

#Connect to MG
$ManagementServer = $env:COMPUTERNAME
Write-Host "Connecting to Management Group via $ManagementServer`..."
$MGConnSetting = New-Object Microsoft.EnterpriseManagement.ManagementGroupConnectionSettings($ManagementServer)
$MG = New-Object Microsoft.EnterpriseManagement.ManagementGroup($MGConnSetting)

$IncreaseMPVersion = [System.Convert]::ToBoolean($IncreaseMPVersion)

#Get the group class
Write-Host "Group Instance Monitoring Object Id: '$TargetId'."
Write-Host "Algorithm: '$Algorithm'."
If ($Algorithm -ieq 'percentage')
{
Write-Host "Percentage: $percentage"
}
$GroupInstance = $MG.GetMonitoringObject($TargetId)
$GroupName = $GroupInstance.FullName
Write-Host "Getting the group class '$GroupName'."
$GroupClassCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.MonitoringClassCriteria("Name='$GroupName'")
$GroupClass = $MG.GetMonitoringClasses($GroupClassCriteria)[0]
If ($GroupClass -eq $null)
{
Write-Error "$GroupName is not found."
Exit 1
}

#Check if this monitoring class is actually an instance group, computer group or the base group system.group
Write-Host "Check if '$GroupName' is a group."
$GroupBaseTypes = $GroupClass.GetBaseTypes()
$bIsGroup = $false
Foreach ($item in $GroupBaseTypes)
{
$GroupBaseTypeID = $item.Id.Tostring()
Switch ($GroupBaseTypeID)
{
#Instance Group
'4ce499f1-0298-83fe-7740-7a0fbc8e2449'
{
$bIsGroup = $true
$GroupType = "InstanceGroup"
}
#Computer Group
'0c363342-717b-5471-3aa5-9de3df073f2a'
{
Write-Host "Warning: Computer groups already have dependency monitors created out of the box. These monitors may be redundent. Please check after the task is completed."
$bIsGroup = $true
$GroupType = "ComputerGroup"
}
#None of above, then check the base type System.Group
'd0b32736-5344-2fcc-74b3-f72dc64ef572'
{
$bIsGroup = $true
If ($GroupType -eq $null)
{
$GroupType = "SystemGroup"
}
}
}
}
If ($bIsGroup -eq $false)
{
Write-Error "$GroupName is not a group."
Exit 1
}
Write-Host "Group Type: '$GroupType'"

If ($GroupCalss.DisplayName -ne $null)
{
$GroupDisplayName = $GroupClass.DisplayName
} else {
$GroupDisplayName = $GroupName
}

#Get the group MP
$GroupMP = $GroupClass.GetManagementPack()
$GroupMPName = $GroupMP.Name
If ($GroupMP.Sealed -eq $true)
{
Write-Host "The group '$GroupName' is defined in a sealed MP. Getting the desintation MP '$ManagementPackName'."
if ($ManagementPackName -eq $null)
{
Write-Error "Unable to continue because the `$ManagementPack parameter is not specified and the group is defined in a sealed management pack. Please specify an unsealed MP to store the dependency monitors."
Exit 1
} else {
#Get the destination MP
$DestinationMPCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackCriteria("Name='$ManagementPackName'")
$DestinationMP = $MG.GetManagementPacks($DestinationMPCriteria)[0]

If ($DestinationMP -eq $null)
{
Write-Error "Unable to find the management pack '$ManagementPackName' in the management group. Unable to continue."
Return $false
} else {
If ($DestinationMP.Sealed -eq $true)
{
Write-Error "The specified management pack '$ManagementPackName' is a sealed MP. Unable to save dependency monitors to a sealed MP. Please specify an unsealed MP."
Exit 1
}
}
}
} else {
Write-Host "The group '$GroupName' is defined in an unsealed MP '$GroupMPName'. the dependency monitors will be stored in the same MP."
$DestinationMP = $GroupMP
}

#Destination MP Name
$DestinationMPName = $DestinationMP.Name
Write-Host "The dependency monitors will be created in management pack '$DestinationMPName'."

#Create the dependecy monitors
#Monitor names
Write-Host "Determining depdency monitor names."
$AvailabilityDependencyMonitorName = "$GroupName`.Availability.Dependency.Monitor"
$ConfigurationDependencyMonitorName = "$GroupName`.Configuration.Dependency.Monitor"
$PerformanceDependencyMonitorName = "$GroupName`.Performance.Dependency.Monitor"
$SecurityDependencyMonitorName = "$GroupName`.Security.Dependency.Monitor"

#Parent Monitors
Write-Host "Getting parent monitors."
$AvailabilityParentMonitorCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.MonitorCriteria("Name ='System.Health.AvailabilityState'")
$ConfigurationParentMonitorCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.MonitorCriteria("Name ='System.Health.ConfigurationState'")
$PerformanceParentMonitorCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.MonitorCriteria("Name ='System.Health.PerformanceState'")
$SecurityParentMonitorCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.MonitorCriteria("Name ='System.Health.SecurityState'")

$AvailabilityParentMonitor = $MG.GetMonitors($AvailabilityParentMonitorCriteria)[0]
$ConfigurationParentMonitor = $MG.GetMonitors($ConfigurationParentMonitorCriteria)[0]
$PerformanceParentMonitor = $MG.GetMonitors($PerformanceParentMonitorCriteria)[0]
$SecurityParentMonitor = $MG.GetMonitors($SecurityParentMonitorCriteria)[0]

#Relationship Types
Write-Host "Getting relationship type."
If ($GroupType -ieq "instancegroup")
{
$RelationshipMPCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackCriteria("Name='Microsoft.SystemCenter.InstanceGroup.Library'")
$RelationshipMP = $MG.GetManagementPacks($RelationshipMPCriteria)[0]
$RelationshipClass = $MG.GetMonitoringRelationshipClass("Microsoft.SystemCenter.InstanceGroupContainsEntities", $RelationshipMP)
} elseif ($GroupType -ieq "computergroup") {
$RelationshipMPCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackCriteria("Name='Microsoft.SystemCenter.Library'")
$RelationshipMP = $MG.GetManagementPacks($RelationshipMPCriteria)[0]
$RelationshipClass = $MG.GetMonitoringRelationshipClass("Microsoft.SystemCenter.ComputerGroupContainsComputer", $RelationshipMP)
} elseif ($GroupType -ieq "systemgroup") {
$RelationshipMPCriteria = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackCriteria("Name='System.Library'")
$RelationshipMP = $MG.GetManagementPacks($RelationshipMPCriteria)[0]
$RelationshipClass = $MG.GetMonitoringRelationshipClass("System.Containment", $RelationshipMP)
}

#Availability Dependecy Monitor
Write-Host "Creating Availability Dependency monitor '$AvailabilityDependencyMonitorName'."
$AvailabilityDependencyMonitor = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitor($DestinationMP,$AvailabilityDependencyMonitorName,[Microsoft.EnterpriseManagement.Configuration.ManagementPackAccessibility]::Public)
$AvailabilityDependencyMonitor.DisplayName = "$GroupDisplayName Availability Dependency Monitor"
$AvailabilityDependencyMonitor.Category = [Microsoft.EnterpriseManagement.Configuration.ManagementPackCategoryType]::AvailabilityHealth
$AvailabilityDependencyMonitor.ParentMonitorID = $AvailabilityParentMonitor
$AvailabilityDependencyMonitor.RelationshipType = $RelationshipClass
$AvailabilityDependencyMonitor.Target = $GroupClass
$AvailabilityDependencyMonitor.Enabled = [Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitoringLevel]::true
$AvailabilityDependencyMonitor.Remotable = $true
$AvailabilityDependencyMonitor.Priority = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWorkflowPriority]::Normal
#Member monitor is same as parrent monitor
$AvailabilityDependencyMonitor.MemberMonitor = $AvailabilityParentMonitor
$AvailabilityDependencyMonitor.MemberUnAvailable = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberUnavailable
$AvailabilityDependencyMonitor.Algorithm = [Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitorAlgorithm]::$Algorithm
If ($Algorithm -ieq 'percentage')
{
$AvailabilityDependencyMonitor.AlgorithmParameter = $Percentage
}
If ($MemberInMaintenance)
{
$AvailabilityDependencyMonitor.MemberInMaintenance = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberInMaintenance
}

#Configuration Dependency Monitor
Write-Host "Creating Configuration Dependency monitor '$ConfigurationDependencyMonitorName'."
$ConfigurationDependencyMonitor = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitor($DestinationMP,$ConfigurationDependencyMonitorName,[Microsoft.EnterpriseManagement.Configuration.ManagementPackAccessibility]::Public)
$ConfigurationDependencyMonitor.DisplayName = "$GroupDisplayName Configuration Dependency Monitor"
$ConfigurationDependencyMonitor.Category = [Microsoft.EnterpriseManagement.Configuration.ManagementPackCategoryType]::ConfigurationHealth
$ConfigurationDependencyMonitor.ParentMonitorID = $ConfigurationParentMonitor
$ConfigurationDependencyMonitor.RelationshipType = $RelationshipClass
$ConfigurationDependencyMonitor.Target = $GroupClass
$ConfigurationDependencyMonitor.Enabled = [Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitoringLevel]::true
$ConfigurationDependencyMonitor.Remotable = $true
$ConfigurationDependencyMonitor.Priority = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWorkflowPriority]::Normal
#Member monitor is same as parrent monitor
$ConfigurationDependencyMonitor.MemberMonitor = $ConfigurationParentMonitor
$ConfigurationDependencyMonitor.MemberUnAvailable = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberUnavailable
$ConfigurationDependencyMonitor.Algorithm = [Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitorAlgorithm]::$Algorithm
If ($Algorithm -ieq 'percentage')
{
$ConfigurationDependencyMonitor.AlgorithmParameter = $Percentage
}
If ($MemberInMaintenance)
{
$ConfigurationDependencyMonitor.MemberInMaintenance = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberInMaintenance
}

#Performance Dependency Monitor
Write-Host "Creating Performance Dependency monitor '$PerformanceDependencyMonitorName'."
$PerformanceDependencyMonitor = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitor($DestinationMP,$PerformanceDependencyMonitorName,[Microsoft.EnterpriseManagement.Configuration.ManagementPackAccessibility]::Public)
$PerformanceDependencyMonitor.DisplayName = "$GroupDisplayName Performance Dependency Monitor"
$PerformanceDependencyMonitor.Category = [Microsoft.EnterpriseManagement.Configuration.ManagementPackCategoryType]::PerformanceHealth
$PerformanceDependencyMonitor.ParentMonitorID = $PerformanceParentMonitor
$PerformanceDependencyMonitor.RelationshipType = $RelationshipClass
$PerformanceDependencyMonitor.Target = $GroupClass
$PerformanceDependencyMonitor.Enabled = [Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitoringLevel]::true
$PerformanceDependencyMonitor.Remotable = $true
$PerformanceDependencyMonitor.Priority = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWorkflowPriority]::Normal
#Member monitor is same as parrent monitor
$PerformanceDependencyMonitor.MemberMonitor = $PerformanceParentMonitor
$PerformanceDependencyMonitor.MemberUnAvailable = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberUnavailable
$PerformanceDependencyMonitor.Algorithm = [Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitorAlgorithm]::$Algorithm
If ($Algorithm -ieq 'percentage')
{
$PerformanceDependencyMonitor.AlgorithmParameter = $Percentage
}
If ($MemberInMaintenance)
{
$PerformanceDependencyMonitor.MemberInMaintenance = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberInMaintenance
}

#Security Dependency Monitor
Write-Host "Creating Security Dependency monitor '$SecurityDependencyMonitorName'."
$SecurityDependencyMonitor = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitor($DestinationMP,$SecurityDependencyMonitorName,[Microsoft.EnterpriseManagement.Configuration.ManagementPackAccessibility]::Public)
$SecurityDependencyMonitor.DisplayName = "$GroupDisplayName Security Dependency Monitor"
$SecurityDependencyMonitor.Category = [Microsoft.EnterpriseManagement.Configuration.ManagementPackCategoryType]::SecurityHealth
$SecurityDependencyMonitor.ParentMonitorID = $SecurityParentMonitor
$SecurityDependencyMonitor.RelationshipType = $RelationshipClass
$SecurityDependencyMonitor.Target = $GroupClass
$SecurityDependencyMonitor.Enabled = [Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitoringLevel]::true
$SecurityDependencyMonitor.Remotable = $true
$SecurityDependencyMonitor.Priority = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWorkflowPriority]::Normal
#Member monitor is same as parrent monitor
$SecurityDependencyMonitor.MemberMonitor = $SecurityParentMonitor
$SecurityDependencyMonitor.MemberUnAvailable = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberUnavailable
$SecurityDependencyMonitor.Algorithm = [Microsoft.EnterpriseManagement.Configuration.ManagementPackDependencyMonitorAlgorithm]::$Algorithm
If ($Algorithm -ieq 'percentage')
{
$SecurityDependencyMonitor.AlgorithmParameter = $Percentage
}
If ($MemberInMaintenance)
{
$SecurityDependencyMonitor.MemberInMaintenance = [Microsoft.EnterpriseManagement.Configuration.HealthState]::$MemberInMaintenance
}

#Increase MP version
If ($IncreaseMPVersion)
{
$CurrentVersion = $DestinationMP.Version.Tostring()
$vIncrement = $CurrentVersion.Split('.')
$vIncrement[$vIncrement.Length - 1] = ([System.Int32]::Parse($vIncrement[$vIncrement.Length - 1]) + 1).ToString()
$NewVersion = ([System.String]::Join('.', $vIncrement))
$DestinationMP.Version = $NewVersion
}

#Verify and save the monitor
Try {
$DestinationMP.verify()
$DestinationMP.AcceptChanges()
Write-Host "Group dependency monitors created in Management Pack '$DestinationMPName'($($DestinationMP.Version))."
} Catch {
$DestinationMP.RejectChanges()
Write-Error $_.Exception.InnerException
Write-Error "Unable to dependency monitors for group '$GroupName' in management pack $DestinationMPName."
Exit 1
}</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>TargetId</Name>
<Value>$Config/TargetId$</Value>
</Parameter>
<Parameter>
<Name>Algorithm</Name>
<Value>$Config/Algorithm$</Value>
</Parameter>
<Parameter>
<Name>Percentage</Name>
<Value>$Config/Percentage$</Value>
</Parameter>
<Parameter>
<Name>MemberUnavailable</Name>
<Value>$Config/MemberUnavailable$</Value>
</Parameter>
<Parameter>
<Name>MemberInMaintenance</Name>
<Value>$Config/MemberInMaintenance$</Value>
</Parameter>
<Parameter>
<Name>ManagementPackName</Name>
<Value>$Config/ManagementPackName$</Value>
</Parameter>
<Parameter>
<Name>IncreaseMPVersion</Name>
<Value>$Config/IncreaseMPVersion$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="Script"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>