Site Services Discovery Probe Action

MECM.SiteServices.Discovery.PA (ProbeActionModuleType)

This probe finds the configuration baselines on a ConfigMgr hierarchy.

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
FT ConditionDetection System.ExpressionFilter Default

Overrideable Parameters:

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

Source Code:

<ProbeActionModuleType ID="MECM.SiteServices.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>SiteServicesDiscovery.js</ScriptName>
<LogLevel>$Config/LogLevel$</LogLevel>
<Arguments>$Config/Arguments$</Arguments>
<ScriptBody><Script><!-- $IncludeFileContent/"../../../Scripts/Discovery/Replication.js"$ --><!-- $IncludeFileContent/"../../../Scripts/Discovery/SdkProviders.js"$ --><!-- $IncludeFileContent/"../../../Scripts/Discovery/SiteServices.js"$ --><!-- $IncludeFileContent/"../../../Scripts/Discovery/_Return.js"$ -->(function ($, sccm, data) {
// BEGIN Discovery(MEF $, WMI sccm, DiscoveryData data)

var numArgs = $.Arguments.Count();
// ParseToInt
var siteType = numArgs &gt; 4 ? parseInt($.Arguments(4)) : undefined;

var siteDef, relationship;

// Create SiteInstance
// this siteType come from registry (1:Primary, 2:Secondary, 8:CAS)
switch (siteType) {
case 1:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.PrimarySite']$");
break;

case 2:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.SecondarySite']$");

break;
case 4:
case 8:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.CentralSite']$");
break;
}
siteDef.AddProperty("$MPElement[Name='MECM.Site']/SiteServer$", sccm.SiteServer);

// Find ChildSites
sccm("SMS_Site").Where("Status != 4 AND ReportingSiteCode = '" + sccm.SiteCode + "'").each(function () {
var endPoint;
var siteCode = this.SiteCode;
var parentSite = this.ReportingSiteCode;
var serverFqdn = sccm.SiteServer;
var isSP1 = this.buildnumber &gt; 7711? "1" : "0";
//var isSP1 = "true";


switch (this.Type) {
case 1:
endPoint = data.CreateClassInstance("$MPElement[Name='MECM.ReplicationToSecondarySite']$");
break;
case 2:
endPoint = data.CreateClassInstance("$MPElement[Name='MECM.ReplicationToPrimarySite']$");
break;
}

// Display Name
endPoint.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", sccm.SiteCode + " - " + siteCode);
// Source Site
endPoint.AddProperty("$MPElement[Name='MECM.Replication']/SiteCode$", sccm.SiteCode);
// Destination Site
endPoint.AddProperty("$MPElement[Name='MECM.Replication']/TargetSiteCode$", siteCode);
// Site Server FQDN
endPoint.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $.Trim(serverFqdn, "/\\").toUpperCase());
// Is Site SP1 or not
endPoint.AddProperty("$MPElement[Name='MECM.Replication']/IsSP1$", isSP1);

data.AddInstance(endPoint);

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

data.AddInstance(relationship);
});

// Find ParentSite
sccm("SMS_Site").Where("SiteCode = '" + sccm.SiteCode + "'").each(function () {
var endPoint;
var siteCode = this.SiteCode;
var parentSite = this.ReportingSiteCode;
var serverFqdn = sccm.SiteServer;
var isSP1 = this.buildnumber &gt; 7711? "1" : "0";
//var isSP1 = "true";

if (parentSite != "")
{
switch (this.Type) {
case 1:
endPoint = data.CreateClassInstance("$MPElement[Name='MECM.ReplicationToPrimarySite']$");
break;
case 2:
endPoint = data.CreateClassInstance("$MPElement[Name='MECM.ReplicationToCentralSite']$");
break;
}

// Display Name
endPoint.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", sccm.SiteCode + " - " + parentSite);
// Source Site
endPoint.AddProperty("$MPElement[Name='MECM.Replication']/SiteCode$", sccm.SiteCode);
// Destination Site
endPoint.AddProperty("$MPElement[Name='MECM.Replication']/TargetSiteCode$", parentSite);
// Site Server FQDN
endPoint.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $.Trim(serverFqdn, "/\\").toUpperCase());
// Is Site SP1 or not
endPoint.AddProperty("$MPElement[Name='MECM.Replication']/IsSP1$", isSP1);

data.AddInstance(endPoint);

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

data.AddInstance(relationship);
}
});

// Add provider location for monitoring
var serverDef = data.CreateClassInstance("$MPElement[Name='MECM.SiteServer']$");
var serverFqdn = sccm.SiteServer;
serverDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $.Trim(serverFqdn, "/\\").toUpperCase());
serverDef.AddProperty("$MPElement[Name='MECM.SiteServer']/ProviderLocation$", sccm.ProviderLocation);
data.AddInstance(serverDef);

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

var roleClassMap = $("ConfigMgr.RoleClassMap");
var roleDisplayName = $("ConfigMgr.RoleDisplayName");

var numArgs = $.Arguments.Count();
// ParseToInt
var siteType = numArgs &gt; 4 ? parseInt($.Arguments(4)) : undefined;
var hierarchyId = numArgs &gt; 5 ? $.Arguments(5) : undefined;

var targetSiteCode = sccm.SiteCode;

var siteDef, relationship;

// Create SiteInstance
// this siteType come from registry (1:Primary, 2:Secondary, 8:CAS)
switch (siteType) {
case 1:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.PrimarySite']$");
break;

case 2:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.SecondarySite']$");

break;
case 4:
case 8:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.CentralSite']$");
break;
}
siteDef.AddProperty("$MPElement[Name='MECM.Site']/SiteServer$", sccm.SiteServer);

data.AddInstance(siteDef);

var siteServer = sccm.SiteServer;
var siteWmi = $.Import("WMI").Connect(siteServer, "root\\sms");
var roleName = "ConfigMgr SDK Provider";

siteWmi("SMS_ProviderLocation").Where("SiteCode = '" + targetSiteCode + "'").each(function () {
var targetServerFqdn = this.Machine;
var targetServerName = targetServerFqdn;

if ($.EqualsIgnoreCase(targetServerFqdn, siteServer))
{
serverDef = data.CreateClassInstance("$MPElement[Name='MECM.SiteServer']$");
}
else
{
serverDef = data.CreateClassInstance("$MPElement[Name='MECM.SiteSystemServer']$");

var serverQuery = $.Format("\
SELECT res.ServerRemoteName, res.ServerName FROM SMS_SystemResourceList as res \n\
WHERE res.SiteCode ='{0}' AND res.ServerRemoteName = '{1}' AND res.RoleName ='SMS Site System'", targetSiteCode, targetServerFqdn);
var isSiteSystem = false;

// Find all servers
sccm.Query(serverQuery, function () {
isSiteSystem = true;
});

if (isSiteSystem == false)
{
serverDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", targetServerName);
serverDef.AddProperty("$MPElement[Name='MECM.Server']/HierarchyId$", hierarchyId);
serverDef.AddProperty("$MPElement[Name='MECM.Server']/SiteCode$", targetSiteCode);
}
}

serverDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetServerFqdn);

data.AddInstance(serverDef);

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

data.AddInstance(relationship);

var roleClass = roleClassMap(roleName);
var displayName = roleDisplayName(roleName);

var roleDef = data.CreateClassInstance(roleClass);
roleDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetServerFqdn);
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", displayName + " - " + targetServerName);
roleDef.AddProperty("$MPElement[Name='MECM.SiteRole']/RoleName$", roleName);
roleDef.AddProperty("$MPElement[Name='MECM.SiteRole']/SiteCode$", targetSiteCode);

data.AddInstance(roleDef);

relationship = data.CreateRelationshipInstance("$MPElement[Name='MECM.ServersContainsSiteRoles']$")
relationship.Source = serverDef;
relationship.Target = roleDef;

data.AddInstance(relationship);
});

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

(function ($, sccm, data) {
// BEGIN Discovery(MEF $, WMI sccm, DiscoveryData data)

var roleClassMap = $("ConfigMgr.RoleClassMap");

var numArgs = $.Arguments.Count();
// ParseToInt
var siteType = numArgs &gt; 4 ? parseInt($.Arguments(4)) : undefined;
var parentSiteCode = numArgs &gt; 6 ? $.Arguments(6) : undefined;
var targetSiteCode = sccm.SiteCode;

var siteDef, relationship;

// only available for CAS and Standalone Primary
if ($.IsNullOrEmpty(parentSiteCode) == false)
{
return;
}

// Create SiteInstance
// this siteType come from registry (1:Primary, 2:Secondary, 8:CAS)
switch (siteType) {
case 1:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.PrimarySite']$");
break;

case 2:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.SecondarySite']$");

break;
case 4:
case 8:
siteDef = data.CreateClassInstance("$MPElement[Name='MECM.CentralSite']$");
break;
}
siteDef.AddProperty("$MPElement[Name='MECM.Site']/SiteServer$", sccm.SiteServer);

// Configuration Baselines
roleQuery = $.Format("\
SELECT al.Name, al.TypeID, al.TypeInstanceID from SMS_Alert as al \n\
WHERE al.TypeID = 14 \n\
AND al.MonitoredByScom = 1 \n\
AND (al.SourceSiteCode IS NULL OR al.SourceSiteCode='{0}')", targetSiteCode);

sccm.Query(roleQuery, function () {
var roleDef;
var typeId = this.TypeID;
var typeInstanceId = this.TypeInstanceID;
var alertName = this.Name;

roleDef = data.CreateClassInstance("$MPElement[Name='MECM.ConfigurationBaseline']$");
roleDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sccm.SiteServer);
roleDef.AddProperty("$MPElement[Name='MECM.ConfigurationBaseline']/TypeId$", typeId);
roleDef.AddProperty("$MPElement[Name='MECM.ConfigurationBaseline']/TypeInstanceId$", typeInstanceId);
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", alertName);

data.AddInstance(roleDef);

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

data.AddInstance(relationship);
});

//Alert Discovery from SMS_AlertBase
roleQuery = $.Format("\
SELECT Name, TypeID, TypeInstanceID, instancenameparam1 from SMS_AlertBase");

sccm.Query(roleQuery, function () {
var roleDef;
var typeId = this.TypeID;
var typeInstanceId = this.TypeInstanceID.replace(/\\/g,"\\\\"); // escape "\\"
typeInstanceId = typeInstanceId.replace(/\"/g, "\\\""); // escape "\""
var alertName = this.Name;
var instancenameparam1 = this.instancenameparam1;

switch (typeId){
//Alert Discovery from SMS_EPAlert
case 31:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMalwareDetection']$");
break;
case 32:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMalwareOutbreak']$");
break;
case 33:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertRepeatedMalwareDetection']$");
break;
case 34:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMultipleMalwareDetection']$");
break;
//Alert Discovery from SMS_CHAlert
case 21:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertClientHealthSLA']$");
break;
case 22:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertClientActivityWarning']$");
break;
case 23:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertClientRemediationWarning']$");
break;
//Alert Discovery from SMS_Alert
case 9:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertSWDAPPSuceessBelowThreshold']$");
break;
case 10:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertSWDAPPErrorExceedThreshold']$");
break;
case 11:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertSUM1DeploySuccessBelowThreshold']$");
break;
case 12:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertSUM2DeploySuccessBelowThreshold']$");
break;
case 15:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMigrationInitialSync']$");
break;
case 16:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMigrationSyncFailure']$");
break;
case 17:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMigrationJobFailure']$");
break;
case 20:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertExchangeConnector']$");
break;
case 35:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertOSDTaskSuccessBelowThreshold']$");
break;
case 36:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertOSDTaskErrorExceedThreshold']$");
break;
case 37:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMigrationAMTWarning']$");
break;
case 38:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertMigrationDPFQDNWarning']$");
break;
case 40:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertDatabaseReplicationDLLError']$");
break;
case 41:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertCloudDPStorageWarning']$");
break;
case 42:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertCloudDPStorageCritical']$");
break;
case 43:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertCloudDPTrafficOutWarning']$");
break;
case 44:
roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AlertCloudDPTrafficOutCritical']$");
break;
default:
roleDef = null;
}
if(roleDef != null)
{
roleDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sccm.SiteServer);
roleDef.AddProperty("$MPElement[Name='MECM.AlertBaseClass']/TypeId$", typeId);
roleDef.AddProperty("$MPElement[Name='MECM.AlertBaseClass']/TypeInstanceId$", typeInstanceId);
if(typeId == 12)
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "Low deployment success rate alert of update group: " + instancenameparam1);
else if(typeId == 20)
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "Exchange Server connection failure alert from site: " + instancenameparam1);
else if(typeId == 40)
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "Low deployment success rate alert of update group: " + instancenameparam1);
else
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", alertName);

data.AddInstance(roleDef);

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

data.AddInstance(relationship);
}


});

// AI Proxy
roleQuery = "SELECT ai.ProxyName, ai.SiteCode from SMS_AIProxy as ai WHERE ai.ProxyEnabled = 1";

sccm.Query(roleQuery, function () {
var roleDef;
var name = this.ProxyName;
var site = this.SiteCode;

roleDef = data.CreateClassInstance("$MPElement[Name='MECM.AICatalogSynchronization']$");
roleDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", sccm.SiteServer);
roleDef.AddProperty("$MPElement[Name='MECM.AICatalogSynchronization']/ProxyName$", name);
roleDef.AddProperty("$MPElement[Name='MECM.AICatalogSynchronization']/SiteCode$", site);
roleDef.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", name);

data.AddInstance(roleDef);

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

data.AddInstance(relationship);
});

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


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

</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
<ConditionDetection ID="FT" TypeID="System!System.ExpressionFilter">
<Expression>
<Or>
<Expression>
<SimpleExpression>
<ValueExpression>
<Value Type="Integer">$Target/Property[Type="MECM.SiteServer"]/SiteType$</Value>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="Integer">1</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<Value Type="Integer">$Target/Property[Type="MECM.SiteServer"]/SiteType$</Value>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="Integer">8</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</Or>
</Expression>
</ConditionDetection>
</MemberModules>
<Composition>
<Node ID="PA">
<Node ID="FT"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
<InputType>System!System.BaseData</InputType>
</ProbeActionModuleType>