var roleClassMap = $("ConfigMgr.RoleClassMap");
var roleDisplayName = $("ConfigMgr.RoleDisplayName");
var numArgs = $.Arguments.Count();
var hierarchyId = sccm.SiteId;
var targetSiteCode = sccm.SiteCode;
var targetServerName = numArgs > 3 ? $.Arguments(3) : undefined;
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 serverName = this.ServerName;
var serverFqdn;
var targetServerFqdn = targetServerName;
var targetSiteType = siteMap[targetSiteCode].SiteType;
var siteServerFqdn = siteMap[targetSiteCode].SiteServerFqdn;
var parentSiteCode = siteMap[targetSiteCode].ParentSiteCode;
var parentSiteType, parentSiteFqdn;
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 = '" + targetSiteCode + "') \n\
AND ServerName = '" + targetServerName + "'\n\
AND res.RoleName ='SMS Site System'";
// Find all servers under the site code sccm.SiteCode
sccm.Query(serverQuery, function () {
// Complete the SiteSystemInfo here instead of in hierarchy.js
var siteSystemDef, serverFqdn;
var serverQuery = $.Format("\
SELECT res.ServerRemoteName, res.ServerName FROM SMS_SystemResourceList as res \n\
WHERE res.SiteCode ='{0}' AND res.RoleName ='SMS Site Server'", targetSiteCode);
// Add SiteServer & RemoteServers
sccm.Query(serverQuery, function () {
var siteServerName = this.ServerName;
// Add server to hierarchy group
var computer = data.CreateClassInstance("$MPElement[Name='Windows!Microsoft.Windows.Computer']$");
computer.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetServerFqdn);
var group = data.CreateClassInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.HierarchyComputerGroup']$");
group.AddProperty("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.HierarchyComputerGroup']/HierarchyId$", hierarchyId);
// Child Site Discovery
if (isSiteServer == true) {
relationship = data.CreateRelationshipInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.HierarchyGroupContainsSites']$");
relationship.Source = group;
relationship.Target = siteDef;
data.AddInstance(relationship);
var parentSite, relationship;
switch (parentSiteType) {
case 0:
// no parent
break;
case 2:
// parent is primary
parentSite = data.CreateClassInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.PrimarySite']$");
parentSite.AddProperty("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.Site']/SiteServer$", parentSiteFqdn);
relationship = data.CreateRelationshipInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.PrimarySiteContainsSecondarySite']$")
relationship.Source = parentSite;
relationship.Target = siteDef;
data.AddInstance(parentSite);
data.AddInstance(relationship);
break;
case 4:
case 8:
// parent is central site
parentSite = data.CreateClassInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.CentralSite']$");
parentSite.AddProperty("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.Site']/SiteServer$", parentSiteFqdn);
// add site component manager
var roleName = "SMS Site Component Manager";
var displayName = roleDisplayName(roleName);
var roleClass = roleClassMap(roleName);
// Site Roles Discovery
var roleQuery = $.Format("\
SELECT res.RoleName, res.ServerRemoteName, res.ServerName, res.NALPath, cfg.Props, \n\
cfg.FileType, cfg.ItemName, cfg.ItemType, cfg.SiteCode from SMS_SystemResourceList as res \n\
JOIN SMS_SCI_SysResUse as cfg ON cfg.NALPath = res.NALPath and cfg.RoleName = res.RoleName \n\
WHERE res.SiteCode ='{0}' \n\
AND res.RoleName <> 'SMS Site System' \n\
AND res.RoleName <> 'SMS Site Server' \n\
AND res.ServerName = '{1}'", targetSiteCode, targetServerName);
sccm.Query(roleQuery, function () {
var cfg = this["cfg"];
var res = this["res"];
var roleDef, relationship, linkDef, sourceDef, serviceDef;
var roleName = res.RoleName;
var displayName = roleDisplayName(roleName);
var roleClass = roleClassMap(roleName);
}
// Distribution Point
else if ($.EqualsIgnoreCase(roleName, "SMS Distribution Point")) {
var nalPath = res.NALPath;
var serverFqdn = sccm.ResolveServerFqdn(res.ServerName, res.ServerRemoteName);
// add site contains content distribution
linkDef = data.CreateClassInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.ContentDistribution']$");
linkDef.AddProperty("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.ContentDistribution']/DistributionPoint$", serverFqdn);
data.AddInstance(relationship);
}
}
// State Migration Point
else if ($.EqualsIgnoreCase(roleName, "SMS State Migration Point")) {
cfg.Refresh_();
var propList = cfg["PropLists"];
$.ForEach(propList.toArray(), function () {
if ($.EqualsIgnoreCase(this.PropertyListName, "Directories")) {
var values = this["Values"];
var driveList = {};
// values looks like
// "Directory=C:\\;MaxClients=100;MinDiskSpace=100;MinDiskSpaceUnit=1;",
// "Directory=D:\\;MaxClients=100;MinDiskSpace=100;MinDiskSpaceUnit=1;"
$.ForEach(values.toArray(), function () {
var drive = this;
var pattern = "Directory="
var left = drive.indexOf(pattern);
if (left >= 0) {
drive = drive.substr(left + pattern.length);
var right = drive.indexOf(";");
if (right > 0) {
drive = drive.substr(0, right);
}
// We only C: D:, no /\
var regEx = new RegExp("^[a-zA-Z]:");
var match = regEx.exec(drive);
if (match == null) {
drive = "";
} else if (match.length > 0) {
drive = match[0].toUpperCase();
} else {
drive = "";
}
if ($.IsNullOrEmpty(drive) == false &&
driveList[drive] === undefined) {
var drvDef = data.CreateClassInstance("$MPElement[Name='SCCM!Microsoft.SystemCenter2012.ConfigurationManager.ContentStorageDrive']$");
drvDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetServerFqdn);
drvDef.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.LogicalDevice']/DeviceID$", drive);
data.AddInstance(drvDef);
// to ignore duplicate entries
driveList[drive] = drvDef;
var componentClassNames = $("ConfigMgr.ComponentClassNames");
var componentDisplayNames = $("ConfigMgr.ComponentDisplayNames");
// List components on this server
var serverQuery = $.Format("\
SELECT comp.MachineName, comp.ComponentName FROM SMS_ComponentSummarizer as comp \n\
WHERE TallyInterval='0001128000100008' \n\
AND comp.MachineName ='{0}'", targetServerName);
// Add SiteServer & RemoteServers
sccm.Query(serverQuery, function () {
var component;
var componentName = this.ComponentName;
var displayName = componentDisplayNames(componentName);
var className = componentClassNames(componentName);