Computer Collections Discovery

Quest.Recovery.Manager.for.Active.Directory.Console.Collection.Discovery2 (Discovery)

Discovers Computer Collections existing on a Recovery Manager for Active Directory console instance.

Element properties:

TargetQuest.Recovery.Manager.for.Active.Directory.Console
EnabledTrue
Frequency1800
RemotableFalse

Object Discovery Details:

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

Member Modules:

ID Module Type TypeId RunAs 
Quest.Recovery.Manager.for.Active.Directory.Console.Collection.PSDiscovery DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Quest.Recovery.Manager.for.Active.Directory.PrivilegedMonitoringAccount

Source Code:

<Discovery ID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection.Discovery2" Enabled="true" Target="Quest.Recovery.Manager.for.Active.Directory.Console" ConfirmDelivery="false" Remotable="false" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Quest.Recovery.Manager.for.Active.Directory.Agent">
<Property TypeID="Quest.Recovery.Manager.for.Active.Directory.Agent" PropertyID="TargetComputer"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection">
<Property TypeID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection" PropertyID="ID"/>
<Property TypeID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection" PropertyID="AgentSideBackupPath"/>
<Property TypeID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection" PropertyID="ConsoleSideBackupPath"/>
<Property TypeID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection" PropertyID="CollectFEMetaData"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="Quest.Recovery.Manager.for.Active.Directory.ComputerHostsAgent"/>
</DiscoveryTypes>
<DataSource ID="Quest.Recovery.Manager.for.Active.Directory.Console.Collection.PSDiscovery" RunAs="Quest.Recovery.Manager.for.Active.Directory.PrivilegedMonitoringAccount" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>1800</IntervalSeconds>
<SyncTime>00:00</SyncTime>
<ScriptName>GetRMADCollections.ps1</ScriptName>
<ScriptBody><Script>
Param($SourceId,$ManagedEntityId,$TargetComputer)

function Execute-RmadPsCommand {
param($script)
$script = 'Add-PSSnapin *.RecoveryManager.AD.PowerShell -ErrorAction Stop;' + $script
$scriptBlock = [Scriptblock]::Create($script)
Powershell.exe -command $scriptBlock
}

function Get-RMADCollectionPSObject {
param($TargetComputer, $api)

function Get-RMADCollectionItemsFacade {
Param($CollectionID)

if((Get-Command Get-RMADCollectionItem).Parameters["UseCache"]) {
Execute-RmadPsCommand "Get-RMADCollectionItem $CollectionID -UseCache -ErrorAction Stop"
}
else {
Execute-RmadPsCommand "Get-RMADCollectionItem $CollectionID -ErrorAction Stop"
}
}

try {
$rmadSnapin = Get-PSSnapin *.RecoveryManager.AD.PowerShell -ErrorAction SilentlyContinue
if(-not $rmadSnapin) {
Add-PSSnapin *.RecoveryManager.AD.PowerShell -ErrorAction Stop
}
}
catch {
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"An error occurred while adding powershell snapin. $_ . Details: $($_ | Out-String)" )
}

try {
$collections = Execute-RmadPsCommand "Get-RMADCollection -ErrorAction Stop"
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Discovered all collections. Elapsed: $($sw.Elapsed.TotalSeconds)")
$collections | % {
$collectionPSObject = New-Object psobject -Property @{
TargetComputer = $TargetComputer
Id = $_.Id
Name = $_.Name
AgentSideBackupPath = $_.AgentSideBackupPath
ConsoleSideBackupPath = $_.ConsoleSideBackupPath
CollectForestRecoveryMetadata = $_.CollectForestRecoveryMetadata
CollectionItems = @()}

try {
Get-RMADCollectionItemsFacade $_.Id | % {
$collectionPSObject.CollectionItems += $_.Name
}
}
catch {
$errorMessage = "Error while getting collection items for the collection $($_.Id): $_ . Details: $($_ | Out-String)"
$api.LogScriptEvent('GetRMADCollections.ps1', 16666, 1, $errorMessage)
}
$collectionPSObject
}
}
catch {
$api.LogScriptEvent('GetRMADCollections.ps1',16666,1,"There is an error while getting collections: $_ . Details: $($_ | Out-String)")
}
}

$api = New-Object -ComObject 'MOM.ScriptAPI'
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Discovery script started")

$discoveryData = $api.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Discovery data object created")
$discoveryData.IsSnapshot = $True

$sw = [Diagnostics.Stopwatch]::StartNew()
$collections = Get-RMADCollectionPSObject $TargetComputer $api
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Discovered all collection items. Elapsed: $($sw.Elapsed.TotalSeconds)")

$DateLimitDays = 30 # collect data for the last 30 days

$tmpInitCache = Execute-RmadPsCommand "Get-RMADSession -DayCount $DateLimitDays"
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Initiated Session Cache. Elapsed: $($sw.Elapsed.TotalSeconds)")

if((Get-Command Get-RMADBackup).Parameters["MinDate"]) {
$backups = Execute-RmadPsCommand "Get-RMADBackup -All -MinDate (Get-Date).AddDays(-$DateLimitDays)"
}
else {
$backups = Execute-RmadPsCommand "Get-RMADBackup -All"
$api.LogScriptEvent('GetRMADCollections.ps1',16666,1,"Retrieving data using outdated PowerShell API; it may be slow, consider installing latest updates for RMAD")
}
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Got all backups list. Elapsed: $($sw.Elapsed.TotalSeconds)")

$collections | % {
$collectionInstance = $discoveryData.CreateClassInstance("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']$")
$hasCollectionItems = if ($_.CollectionItems) { "Success" } else { "Warning" }

$collectionInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $TargetComputer)
$collectionInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']/ID$", $_.Id)
$collectionInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']/HasCollectionItems$", $hasCollectionItems)
$collectionInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $_.Name)
$collectionInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']/AgentSideBackupPath$", $_.AgentSideBackupPath)
$collectionInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']/ConsoleSideBackupPath$", $_.ConsoleSideBackupPath)
$collectionInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']/CollectFEMetaData$", $_.CollectForestRecoveryMetadata)

$discoveryData.AddInstance($collectionInstance)

$currentCollection = $_
if((Get-Command Get-RMADSession).Parameters["UseCache"])
{
$Sessions = Powershell.exe -command {param($DateLimitDays); Add-PSSnapin *.RecoveryManager.AD.PowerShell -ErrorAction Stop; Get-RMADSession -CollectionId $_.Id -DayCount $DateLimitDays -UseCache -ErrorAction Stop} -args @($DateLimitDays)
}
else
{
$Sessions = Powershell.exe -command {param($DateLimitDays); Add-PSSnapin *.RecoveryManager.AD.PowerShell -ErrorAction Stop; Get-RMADSession -CollectionId $_.Id -DayCount $DateLimitDays -ErrorAction Stop} -args @($DateLimitDays)
}
$_.CollectionItems | % {
$CompName = $_
$backupExistsStatus = if($backups | ? { $_.ComputerName -eq $CompName }) { "Success" } else { "Warning" }
$lastSession = $sessions | % {
$session = $_
$session.SessionItems | ? { $_.DCName -eq $CompName } | % { [PSObject] @{'Name' = $_.DCName; 'Date' = $session.EndDate; 'Result' = $_.Result; 'Error' = $_.ErrorText } }
} | ? { $_ } | Sort -Property @{ Expression = { $_.Date } } | Select -Last 1

$collectionItemInstance = $discoveryData.CreateClassInstance("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Agent']$")
$collectionItemInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$",$TargetComputer)
$collectionItemInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Console.Collection']/ID$",$currentCollection.Id)
$collectionItemInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Agent']/BackupExists$",$backupExistsStatus)
$collectionItemInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Agent']/TargetComputer$", $_)
$collectionItemInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Agent']/LastSessionResult$", ($lastSession.Result | Out-String))
$collectionItemInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Agent']/LastSessionDate$", ($lastSession.Date | Out-String))
$collectionItemInstance.AddProperty("$MPElement[Name='Quest.Recovery.Manager.for.Active.Directory.Agent']/LastSessionError$", ($lastSession.Error | Out-String))

$discoveryData.AddInstance($collectionItemInstance)
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"Collection item $_ added. LastSessionResult: $($lastSession.Result). BackupExists: $backupExistsStatus. Elapsed: $($sw.Elapsed.TotalSeconds)")
}
}
$api.LogScriptEvent('GetRMADCollections.ps1',16666,0,"All instances added, discovery data returned. Elapsed: $($sw.Elapsed.TotalSeconds)")
$discoveryData
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>SourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>ManagedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>TargetComputer</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>