Protected computer and resource group discovery

Microsoft.SystemCenter.DataProtectionManager.2011.Discovery.PSDiscovery (Discovery)

Element properties:

TargetMicrosoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer
EnabledTrue
Frequency43200
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:
Discovered relationships and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
PSDiscovery DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Default

Source Code:

<Discovery ID="Microsoft.SystemCenter.DataProtectionManager.2011.Discovery.PSDiscovery" Enabled="true" Target="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"/>
<DiscoveryClass TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer"/>
<DiscoveryRelationship TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServerHostsProductionServer"/>
</DiscoveryTypes>
<DataSource ID="PSDiscovery" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>43200</IntervalSeconds>
<SyncTime/>
<ScriptName>PSDiscovery.ps1</ScriptName>
<ScriptBody><Script>#Read input parameters
param($sourceType,$sourceId,$managedEntityId,$dpmServerName)

function DisplayError()
{
param($description, $severity, $errorCode, $exceptionString, $resolutionString)

$evt = new-object System.Diagnostics.EventLog("DPM Alerts");
$evt.Source = "DPM-EM";
$eventSeverity = [System.Diagnostics.EventLogEntryType]::Information;

#severity = 0 is info and severity = 1 is warning
if($severity -eq 1)
{
$eventSeverity = [System.Diagnostics.EventLogEntryType]::Warning;
}

$errString = new-object system.text.stringBuilder
$errString.AppendLine($description)

if($exceptionString -ne $null)
{
$errString.AppendLine()
$errString.AppendLine("Problem: " + $exceptionString)
}

if($resolutionString -ne $null)
{
$errString.AppendLine()
$errString.AppendLine("Resolution: " + $resolutionString)
}

$evt.WriteEntry($errString.ToString(), $eventSeverity, $errorCode);
}


$desc = "Production server discovery start event for dpmServerName =" + $dpmServerName
DisplayError $desc 0 101 $null $null

# Load DPM snapin
$dpmBinPath = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft Data Protection Manager\Setup" "UIInstallPath").UIInstallPath
. "$dpmBinPath\GlobalFunctions.ps1"
LoadDPMSnapin

#Create and Instantinate SCOM discovery objects
$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData($sourceType, $sourceId, $managedEntityId)

try
{
#Connect to DPM server
$err = $($dpmServer = Connect-DPMServer $dpmServerName) 2&gt;&amp;1
if (!$dpmServer)
{
$desc = "Production server discovery - Unable to connect to DPM Server=" + $dpmServerName
if($err)
{
DisplayError $desc 1 102 $err.Exception.ToString() $err.Exception.Error.Resolution.ToString()
}
else
{
DisplayError $desc 1 102 $null $null
}

exit 1
}

#Get DPM properties
$dpmVersion = $dpmServer.GetProductInformation().Version.ToString()
$dpmServerId = $dpmServer.ServerId.ToString()

#Get PS list for the DPM server
$err = $($allPSList = Get-ProductionServer -DPMServerName $dpmServerName) 2&gt;&amp;1

if($err)
{
$desc = "Unable to retrieve PS list"
DisplayError $desc 1 102 $err.Exception.ToString() $err.Exception.Error.Resolution.ToString()
}

$psList = $allPSList | ?{$_.ServerProtectionState -ine "Deleted" -and !$_.IsProtectedInDisconnectedPG -and $_.IsHavingDatasourcesProtected}

if($psList)
{
$psList = $psList | Sort-Object $_.Name
}

#Define the required lists
$allPSDictionary = @{}

$visitedClusterList = New-Object "System.Collections.Generic.List[System.String]"
$visitedPhysicalNodeList = New-Object "System.Collections.Generic.List[System.String]"

#Create dictionary of PS objects with PS Name as Key and PS Object as Value
foreach($ps1 in $allPSList)
{
$allPSDictionary.Add($ps1.Name, $ps1)
}

foreach ($ps in $psList)
{
if($ps)
{
$psObjects = @()

$virtualName = $ps -as [Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.VirtualName]

if($ps.IsAgentInstalled -or ($virtualName -and $virtualName.PossibleOwners.count -gt 0))
{
$psObjects = $psObjects + $ps

if($virtualName -ne $null)
{
#Check if the corresponding cluster is already visited
if(!$visitedClusterList.Contains($ps.ClusterName))
{
$visitedClusterList.Add($ps.ClusterName)

foreach ($nodeName in $virtualName.PossibleOwners)
{
$physicalNodePSObj = $allPSDictionary[$nodeName]
if($physicalNodePSObj -and !$visitedPhysicalNodeList.Contains($nodeName))
{
$visitedPhysicalNodeList.Add($nodeName)
$psObjects = $psObjects + $physicalNodePSObj
}
}
}
}

$psObjects = $psObjects | Sort-Object $_.Name

foreach($psObj in $psObjects)
{
$version = $null
$osVersion = $null

#RG doesnot have agent installed and OS version associated. Hence skip these values if PS is RG.

$versionObj = $psObj.GetInstalledAgentVersion()
if($versionObj -ne $null)
{
$version = $versionObj.ToString()
}

$osVersionObj = $psObj.OSVersion
if($osVersionObj -ne $null)
{
$osVersion = $osVersionObj.ToString()
}

#Create a production server instance
$psinstance = $discoveryData.CreateClassInstance("$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer"]$")
$psinstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $dpmServerName)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMSeed']/DPMServerName$", $dpmServerName)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer']/DPMServerName$", $dpmServerName)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/ComputerName$", $psObj.Name)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/DPMServerName$", $dpmServerName)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/DPMObjectID$", $psObj.ServerId.ToString())
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/OSVersion$", $osVersion)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/AgentVersion$", $version)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/IsSecondaryProtected$", $psObj.IsProtectedViaDC)
$psinstance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.ProductionServer']/ClusterName$", $psObj.ClusterName)
$psinstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $psObj.Name);
$discoveryData.AddInstance($psinstance)

Remove-Variable psinstance -Confirm:$false
}
}
}
}

#Update DPM properties
$instance = $discoveryData.CreateClassInstance("$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]$")
$instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $dpmServerName)
$instance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMSeed']/DPMServerName$", $dpmServerName)
$instance.AddProperty("$MPElement[Name='SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer']/DPMServerName$", $dpmServerName)
$instance.AddProperty("$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]/DPMVersion$", $dpmVersion)
$instance.AddProperty("$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]/DPMObjectID$", $dpmServerId)
$discoveryData.AddInstance($instance)

Remove-Variable instance -Confirm:$false
}
catch
{
$desc = "Exception in PS discovery"
DisplayError $desc 1 102 $_.ToString() $null
throw $_
}

$desc = "Production server discovery completed"
DisplayError $desc 0 103 $null $null

$discoveryData


#Cleanup Variables
Remove-Variable sourceType -Confirm:$false
Remove-Variable sourceId -Confirm:$false
Remove-Variable managedEntityId -Confirm:$false
Remove-Variable discoveryData -Confirm:$false
Remove-Variable api -Confirm:$false
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>SourceType</Name>
<Value>0</Value>
</Parameter>
<Parameter>
<Name>SourceId</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>ManagedEntityId</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>DPMServerName</Name>
<Value>$Target/Property[Type="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]/DPMServerName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>7200</TimeoutSeconds>
</DataSource>
</Discovery>