Collect Agent Versions

ManagementGroupDiscoveryAgentVersions (Discovery)

Aggregate agent versions for SCOM Summary Dashboard

Element properties:

TargetMicrosoft.SystemCenter.AllManagementServersPool
EnabledTrue
Frequency3600
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
TimedPowerShell DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider System.PrivilegedMonitoringAccount

Source Code:

<Discovery ID="ManagementGroupDiscoveryAgentVersions" Enabled="true" Target="SC!Microsoft.SystemCenter.AllManagementServersPool" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.SystemCenter.AgentVersions"/>
</DiscoveryTypes>
<DataSource ID="TimedPowerShell" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider" RunAs="System!System.PrivilegedMonitoringAccount">
<IntervalSeconds>3600</IntervalSeconds>
<SyncTime/>
<ScriptName>Discover Agent Versions</ScriptName>
<ScriptBody><Script>$errorActionPreference = 'Stop'
Set-StrictMode -Version 2

$SCOMPowerShellKey = "HKLM:\SOFTWARE\Microsoft\System Center Operations Manager\12\Setup\Powershell\V2"
$SCOMModulePath = Join-Path (Get-ItemProperty $SCOMPowerShellKey).InstallDirectory &#x201C;OperationsManager&#x201D;
Import-module $SCOMModulePath

# group agents by version and sort
$versionGroups = Get-SCOMAgent | group Version, PatchList.Value

#add a helper class to get the localized display strings
$langClass = New-Module {

$lang = (Get-Culture).ThreeLetterWindowsLanguageName
$mp = Get-SCOMManagementPack -Name Microsoft.SystemCenter.OperationsManager.SummaryDashboard
# Set localized language to ENU if the expected language is not found in MP
try
{
$temp = $mp.GetDisplayString($lang)
}
catch [Microsoft.EnterpriseManagement.Common.ObjectNotFoundException]
{
$lang = "ENU"
}

function GetLocalizedDisplayString($elementId)
{
$localizedName = $mp.FindManagementPackElementByName($elementId).GetDisplayString($lang).Name
if (!$localizedName) {$localizedName = $elementId}
$localizedName
}
Export-ModuleMember -Variable * -Function *
} -asCustomObject

$api = New-Object -comObject "MOM.ScriptAPI"
$discoveryData = $api.CreateDiscoveryData(0, "$MPElement$", "$Target/Id$")

if ($versionGroups)
{
foreach ($versionGroup in $versionGroups)
{
$name = $versionGroup.Values[0]
if ($name.Trim() -eq '') {$name = $langClass.GetLocalizedDisplayString("NoVersionData")}

$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']$")
$instance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']/Version$", $name)
$instance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']/CumulativeUpdate$", $versionGroup.Values[1])
$instance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']/CountOfVersion$", $versionGroup.Group.Count)

$discoveryData.AddInstance($instance)
}
}
else
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']$")
$localizedName = $langClass.GetLocalizedDisplayString("NoAgentsFound")
$instance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']/CumulativeUpdate$", "")
$instance.AddProperty("$MPElement[Name='Microsoft.SystemCenter.AgentVersions']/Version$", $localizedName)
$discoveryData.AddInstance($instance)
}
$discoveryData</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
<StrictErrorHandling>false</StrictErrorHandling>
</DataSource>
</Discovery>