Microsoft.SystemCenter.OOB.CleanupOrphanedDevices (WriteActionModuleType)

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
InputTypeSystem.BaseData

Member Modules:

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

Source Code:

<WriteActionModuleType ID="Microsoft.SystemCenter.OOB.CleanupOrphanedDevices" Accessibility="Internal" Batching="false">
<Configuration/>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="Script.CleanupOrphanedDevices" TypeID="Windows!Microsoft.Windows.PowerShellWriteAction">
<ScriptName>CleanupOrphanedSMASHDevices.ps1</ScriptName>
<ScriptBody><Script>

$global:eventMG = "."
$global:eventWorkflow = "Microsoft.SystemCenter.OOB.CleanupOrphanedDevices.Rule"
$global:eventInstanceName = "$Target/Property[Type='System!System.Entity']/DisplayName$"
$global:eventInstanceId = "$Target/Id$"
function RaiseEvent($eventType, $eventNumber, $message)
{
$channel = "Operations Manager"
$source = "Health Service Modules Ex"
$eventLog = new-object System.Diagnostics.EventLog -ArgumentList @($channel)
$eventLog.Source = $source

$eventData = @()
$eventData += $global:eventMG
$eventData += $global:eventWorkflow
$eventData += $global:eventInstanceName
$eventData += $global:eventInstanceId
$eventData += $message
$eventData += $source

if($eventType -eq 0)
{
$eventType = [System.Diagnostics.EventLogEntryType]::Information
}
elseif($eventType -eq 1)
{
$eventType = [System.Diagnostics.EventLogEntryType]::Warning
}
elseif($eventType -eq 2)
{
$eventType = [System.Diagnostics.EventLogEntryType]::Error
}

$eventInstance = new-object System.Diagnostics.EventInstance -ArgumentList @($eventNumber, 0, $eventType)
$eventLog.WriteEvent($eventInstance, $eventData)
}

$script:ErrorActionPreference = "SilentlyContinue"
trap
{
RaiseEvent 1 10031 ("OOB MP Cleanup Rule got a script error: [" + $_.Exception.Message + "]")
throw $_.Exception.Message
}

$OMPSInstallKey = "HKLM:\Software\Microsoft\System Center Operations Manager\12\Setup\Powershell\V2"
$regKey = get-item $OMPSInstallKey
$OMPSInstallPath = $regKey.GetValue("InstallDirectory")
$omModule = $OMPSInstallPath + "OperationsManager"
Import-Module -Name $omModule
Start-Sleep -s 20

$computerName = $env:ComputerName + "." + $env:FQDN
$mg = New-Object -TypeName "Microsoft.EnterpriseManagement.ManagementGroup" -ArgumentList @($computerName)

$relationshipName = "Microsoft.SystemCenter.OOB.BMCWindowsComputerContainsSMASHDevice"
$statePropertyName = "SmashDeviceState"
$hasSMASHDevicePropertyName = "HasSMASHDevice"
$relationshipCriteria = New-Object -TypeName "Microsoft.EnterpriseManagement.Configuration.ManagementPackRelationshipCriteria" -ArgumentList @("Name='$relationshipName'")
$relationshipClass = $mg.GetMonitoringRelationshipClasses($relationshipCriteria)[0]

$discoveryData = new-Object -TypeName "Microsoft.EnterpriseManagement.ConnectorFramework.IncrementalDiscoveryData"

$SMASHConnectorGuid = new-object Guid("8A82C145-3EAF-4169-94A0-771DF3A6B069")
$SMASHConnector = $mg.ConnectorFramework.GetConnector($SMASHConnectorGuid)

$WSManDeviceClasscriteria = new-object Microsoft.EnterpriseManagement.Configuration.ManagementPackClassCriteria("Name='Microsoft.SystemCenter.OOB.WSManDevice'")

$WSManDeviceClass = $mg.EntityTypes.GetClasses($WSManDeviceClasscriteria)[0]
$WSManDeviceTemplateProperty = $WSManDeviceClass["TemplateID"]

$GetObjectReaderMethod = [Microsoft.EnterpriseManagement.IEntityObjectsManagement].GetMethod("GetObjectReader", [Type[]]@([Microsoft.EnterpriseManagement.Configuration.ManagementPackClass],[Microsoft.EnterpriseManagement.Common.ObjectQueryOptions]))
$GetObjectReaderGenericMethod = $GetObjectReaderMethod.MakeGenericMethod([Microsoft.EnterpriseManagement.Monitoring.MonitoringObject])
$WSManDevices = $GetObjectReaderGenericMethod.Invoke($mg.EntityObjects, @($WSManDeviceClass, [Microsoft.EnterpriseManagement.Common.ObjectQueryOptions]::Default))

Foreach ($WSManDevice in $WSManDevices)
{
if($WSManDevice -eq $null)
{
continue
}
$TemplateId = $WSManDevice[$WSManDeviceTemplateProperty].Value
$WSManDeviceGroupCriteria = new-object Microsoft.EnterpriseManagement.Configuration.ManagementPackClassCriteria("Name='Microsoft.SystemCenter.OOB." + $TemplateId + ".DeviceGroup'")
$WSManDeviceGroupClasses = $mg.EntityTypes.GetClasses($WSManDeviceGroupCriteria)
if($WSManDeviceGroupClasses.Count -ne 1)
{
$relationships = $mg.GetMonitoringRelationshipObjects($relationshipClass)
foreach($r in $relationships)
{
if($r -eq $null)
{
continue
}

if($r.TargetObject.Id -eq $WSManDevice.Id)
{
$properties = $r.SourceObject.GetProperties()
$propertyCount = 0
foreach($p in $properties)
{
if($p.Name -eq $statePropertyName)
{
$r.SourceObject[$p].Value = "Success"
$propertyCount++
}
if($p.Name -eq $hasSMASHDevicePropertyName)
{
$r.SourceObject[$p].Value = $false
$propertyCount++
}
if($propertyCount -eq 2)
{
break
}
}
$r.SourceObject.Commit()
}
}
$discoveryData.Remove($WSManDevice)
RaiseEvent 0 10030 "OOB MP Cleanup Rule deleted WS-Man Device: [IP] from template [$TemplateId]"
}
}

$discoveryData.Commit($SMASHConnector);

</Script></ScriptBody>
<TimeoutSeconds>600</TimeoutSeconds>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="Script.CleanupOrphanedDevices"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>