Hierarchy Discovery Probe Action

MECM.Hierarchy.Discovery.PA (ProbeActionModuleType)

This probe finds the ConfigMgr hierarchy and its members.

Element properties:

TypeProbeActionModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
InputTypeSystem.BaseData
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
PA ProbeAction MECM.Script.Discovery.PA Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
LogLevelint$Config/LogLevel$LogLevel (0, 1, 2)

Source Code:

<ProbeActionModuleType ID="MECM.Hierarchy.Discovery.PA" Accessibility="Public" Batching="false" PassThrough="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="LogLevel" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Arguments" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="LogLevel" Selector="$Config/LogLevel$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<ProbeAction ID="PA" TypeID="MECM.Script.Discovery.PA">
<ScriptName>HierarchyDiscovery.js</ScriptName>
<LogLevel>$Config/LogLevel$</LogLevel>
<Arguments>$Config/Arguments$</Arguments>
<ScriptBody><Script><!-- $IncludeFileContent/"../../../Scripts/Discovery/Hierarchy.js"$ --><!-- $IncludeFileContent/"../../../Scripts/Discovery/_Return.js"$ -->(function ($, sccm, data) {
// BEGIN Discovery(MEF $, WMI sccm, DiscoveryData data)

var numArgs = $.Arguments.Count();
var hierarchyId = sccm.SiteId;

var siteMap = {};
var currentServerName = "";

// Find Sites
var siteQuery = $.Format(" \
SELECT site.SiteCode, site.Type, site.ReportingSiteCode, site.ServerName, res.ServerRemoteName \n\
FROM SMS_Site as site JOIN SMS_SystemResourceList as res \n\
ON res.SiteCode = site.SiteCode AND res.RoleName ='SMS Site Server'");

sccm.Query(siteQuery, function () {
var site = this["site"];
var res = this["res"];
var siteCode = site.SiteCode;
var siteType = site.Type;
var parentSiteCode = site.ReportingSiteCode;
var serverFqdn;

if ($.EqualsIgnoreCase(siteCode, sccm.SiteCode)) {
currentServerName = site.ServerName;
serverFqdn = sccm.SiteServer;
}
else {
serverFqdn = res.ServerRemoteName;
}

siteMap[siteCode] =
{
"SiteType": siteType,
"SiteServerFqdn": serverFqdn,
"ParentSiteCode": parentSiteCode
};

});

var serverQuery = "\
SELECT res.ServerRemoteName, res.ServerName, res.SiteCode FROM SMS_SystemResourceList as res \n\
WHERE res.SiteCode IN ( SELECT SiteCode FROM SMS_Site WHERE Status != 4 AND SiteCode = '" + sccm.SiteCode + "') \n\
AND res.RoleName ='SMS Site System'";

// Find all servers under the site code sccm.SiteCode
sccm.Query(serverQuery, function () {
var serverDef, serverFqdn, parentSiteCode;
var siteCode = this.SiteCode;
var serverName = this.ServerName;

serverDef = data.CreateClassInstance("$MPElement[Name='MECM.SiteSystemInfo']$");

if ($.EqualsIgnoreCase(currentServerName, serverName)) {
serverFqdn = (siteCode == sccm.SiteCode) ? sccm.SiteServer : this.ServerRemoteName;
}
else {
serverFqdn = this.ServerRemoteName;
}

serverDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sccm.SiteServer);
serverDef.AddProperty("$MPElement[Name='MECM.SiteSystemInfo']/ServerName$", serverName);

data.AddInstance(serverDef);

parentSiteCode = siteMap[siteCode].ParentSiteCode;

if ($.IsNullOrEmpty(parentSiteCode) == true) {
var siteServerFqdn = siteMap[siteCode].SiteServerFqdn;

// top site may have multiple servers.
if ($.EqualsIgnoreCase(siteServerFqdn, serverFqdn)) {
// Here for CAS &amp; Standalone Primary
var siteType = siteMap[siteCode].SiteType;
var siteDef;
var hierarchy = data.CreateClassInstance("$MPElement[Name='MECM.Hierarchy']$");
hierarchy.AddProperty("$MPElement[Name='MECM.Hierarchy']/HierarchyId$", hierarchyId);
hierarchy.AddProperty("$MPElement[Name='MECM.Hierarchy']/SiteServer$", serverFqdn);
hierarchy.AddProperty("$MPElement[Name='MECM.Hierarchy']/SiteCode$", sccm.SiteCode);
hierarchy.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "ConfigMgr - " + sccm.SiteCode);

data.AddInstance(hierarchy);

var group = data.CreateClassInstance("$MPElement[Name='MECM.HierarchyComputers.Group']$");
group.AddProperty("$MPElement[Name='MECM.HierarchyComputers.Group']/HierarchyId$", hierarchyId);
group.AddProperty("$MPElement[Name='MECM.HierarchyComputers.Group']/SiteServer$", serverFqdn);
group.AddProperty("$MPElement[Name='MECM.HierarchyComputers.Group']/SiteCode$", sccm.SiteCode);
group.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "ConfigMgr Hierarchy - " + sccm.SiteCode);

data.AddInstance(group);

if (siteType == 2) {
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.PrimarySite']$");
}
else {
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.CentralSite']$");
}

siteDef.AddProperty("$MPElement[Name='MECM.Site']/SiteServer$", serverFqdn);

relationship = data.CreateRelationshipInstance("$MPElement[Name='MECM.HierarchyContainsSites']$");
relationship.Source = hierarchy;
relationship.Target = siteDef;

data.AddInstance(siteDef);
data.AddInstance(relationship);
}
}
});

// END Discovery(MEF $, WMI sccm, DiscoveryData data)
})($, $("ConfigMgr"), $("DiscoveryData"));


$.Return($("DiscoveryData"));

</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="PA"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
<InputType>System!System.BaseData</InputType>
</ProbeActionModuleType>