var SCRIPT_NAME = "Citrix Server Role Discovery";
CITRIX_WMI_CONNECT = "WINMGMTS:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}\\\\.\\root\\Citrix";
CITRIX_WMI_MGMT_CONNECT = "WINMGMTS:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}\\\\.\\root\\Citrix\\Management";
// event constants
var EVENT_TYPE_SUCCESS = 0;
var EVENT_TYPE_ERROR = 1;
var EVENT_TYPE_WARNING = 2;
var EVENT_TYPE_INFORMATION = 4;
var SourceType, SourceID, ManagedEntityId, TargetComputer, NetbiosComputerName, ServerName;
function ReadRegKey(strKey)
{
var data = "";
var objShell = new ActiveXObject("WScript.Shell");
try
{
data = objShell.RegRead(strKey);
}
catch(ex)
{
if (ex.number != -2147024894) // If not invalid entry or key, throw the error
throw ex;
// Key not found - we might be dealing with a 64-bit machine
strKey = strKey.replace("HKLM\\SOFTWARE", "HKLM\\SOFTWARE\\Wow6432Node");
try
{
data = objShell.RegRead(strKey);
}
catch(ex)
{
if (ex.number != -2147024894) // If not invalid entry or key, throw the error
throw ex;
data = "";
}
}
return (data);
}
//Logs an error event to the MOM event log
function logError(message, error)
{
var str = SCRIPT_NAME + ":\n" + message;
if (error)
{
var num = (error.number < 0) ? (error.number + 0x100000000) : error.number;
var estr = error.description;
if (num == 0x80010105)
estr += " [RPC_E_SERVERFAULT: The server threw an exception.]";
else if (num == 0x80041001)
estr += " [WBEM_E_FAILED]";
else if (num == 0x80010108)
estr += " [RPC_E_DISCONNECTED]";
else if (num == 0x8007007e)
estr += " [ERROR_MOD_NOT_FOUND: The specified module could not be found.]";
else if (num == 0x80041010)
estr += " [WBEM_E_INVALID_CLASS]";
else if (num == 0x8004100e)
estr += " [WBEM_E_INVALID_NAMESPACE]";
if (estr == "")
estr = "<error description not given>";
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.LogEvent(EVENT_TYPE_ERROR, str);
}
function MFCOM_GetZDCName(zoneName)
{
try
{
var oZone = new ActiveXObject("XenAppCOM.XenAppZone");
}
catch(ex)
{
oZone = new ActiveXObject("MetaFrameCOM.MetaFrameZone");
}
oZone.Initialize(zoneName);
return oZone.DataCollector;
}
function Main()
{
var strVersion = ReadRegKey("HKLM\\SYSTEM\\CurrentControlSet\\Control\\Citrix\\NewProductVersion");
var strLicenseSrv = ReadRegKey("HKLM\\SOFTWARE\\Citrix\\Licensing\\MFCM_LSHostName");
var strFarm = ReadRegKey("HKLM\\SOFTWARE\\Citrix\\IMA\\RUNTIME\\Neighborhood");
var strZone = ReadRegKey("HKLM\\SOFTWARE\\Citrix\\IMA\\RUNTIME\\ZoneName");
var bLicensed = ReadRegKey("HKLM\\SOFTWARE\\Citrix\\WMIService\\Licensed");
// On Parra, the registry location for the license server has been changed.
if (strLicenseSrv == "")
strLicenseSrv = ReadRegKey("HKLM\\SOFTWARE\\Policies\\Citrix\\IMA\\Licensing\\LicenseServerHostName");
try
{
var oAPI = new ActiveXObject("MOM.ScriptAPI");
var oDiscoveryData = oAPI.CreateDiscoveryData(SourceType, SourceID, ManagedEntityId);
}
catch(ex)
{
logError("Error creating discovery data", ex);
return;
}
var major = strVersion.slice(0, 1);
var minor = strVersion.slice(-1);
if ( major >= 4 && minor >= 0 )
{
if ( bLicensed == 1 )
{
// Create managed server instance
try
{
var oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.ManagedServer']$");
oInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer);
oInst.AddProperty("$MPElement[Name='CtxLibrary!Citrix.Library.ServerApplication']/Name$", ServerName);
oInst.AddProperty("$MPElement[Name='CtxLibrary!Citrix.Library.ServerApplication']/Version$", strVersion);
oInst.AddProperty("$MPElement[Name='CtxLibrary!Citrix.Library.ServerApplication']/Farm$", strFarm);
oInst.AddProperty("$MPElement[Name='CtxLibrary!Citrix.Library.ServerApplication']/Zone$", strZone);
oInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ManagedServer']/LicenseServer$", strLicenseSrv);
try
{
var oWMIService = GetObject(CITRIX_WMI_CONNECT);
}
catch(ex)
{
logError("Error connecting to Citrix WMI service", ex);
// Failed to connect to WMI service - try at least to submit registry based data
oDiscoveryData.AddInstance(oInst);
oAPI.Return(oDiscoveryData);
return;
}
try
{
var oWMIMgmtService = GetObject(CITRIX_WMI_MGMT_CONNECT);
}
catch(ex)
{
logError("Error connecting to Citrix Management WMI provider", ex);
// Failed to connect to WMI service - try at least to submit registry based data
oDiscoveryData.AddInstance(oInst);
oAPI.Return(oDiscoveryData);
return;
}
try
{
var e = new Enumerator( oWMIService.ExecQuery("SELECT * FROM MetaFrame_Software") );
for (; !e.atEnd(); e.moveNext())
{
var item = e.item();
var productDescr = item.ProductName + " " + item.Version;
if (item.ReleaseLevel != "") {
productDescr += " " + item.ReleaseLevel;
}
if (item.FeatureReleaseLevel != 0) {
productDescr += " Feature Release " + item.FeatureReleaseLevel;
}
oInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ManagedServer']/ProductDescription$", productDescr);
}
}
catch (ex)
{
logError("WMI error retrieving Citrix product version", ex);
}
// Access hotfix info through MFCOM - currently only supporting Version >= 4.0
var NO_HOTFIXES = "No Citrix hotfixes installed";
var hotfixes = NO_HOTFIXES;
try
{
var oServer;
try
{
oServer = new ActiveXObject("XenAppCOM.XenAppServer");
oServer.Initialize(NetbiosComputerName);
}
catch(ex)
{
oServer = new ActiveXObject("MetaFrameCOM.MetaFrameServer");
oServer.Initialize(6, NetbiosComputerName);
oServer = oServer.WinServerObject;
}
//The array of hotfixes returned is a VB safe array, not a standard JScript array
var arrHotfixes = oServer.Hotfixes;
// If our VB Array has zero dimensions, there were no hotfixes returned
if (arrHotfixes.dimensions() > 0)
{
// Get first hotfix name
var objHotfix = arrHotfixes.getItem( arrHotfixes.lbound(1) );
hotfixes = objHotfix.Name;
for (i = arrHotfixes.lbound(1) + 1; i < arrHotfixes.ubound(1) + 1; i++)
{
objHotfix = arrHotfixes.getItem(i);
hotfixes += ", " + objHotfix.Name;
}
}
// need to check Citrix.PresentationServer.ManagedServer string
oInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ManagedServer']/HotfixInfo$", hotfixes);
}
catch (ex)
{
logError("Can't read hotfix information from MFCOM", ex);
hotfixes = NO_HOTFIXES;
}
var isFMS = false, isZDC = false;
// Is this server FMS?
try
{
var oFMSOutParams = oWMIMgmtService.ExecMethod("FarmMetricsAPI", "QueryFMS");
if (oFMSOutParams.ReturnValue == 0) {
if (oFMSOutParams.HostName.toLowerCase() == NetbiosComputerName.toLowerCase()) {
isFMS = true;
}
}
}
catch (ex)
{
logError("WMI error retrieving Citrix farm metric server info", ex);
isFMS = false;
}
// Is this server ZDC?
try
{
var oZDCOutParams = oWMIService.Get("Citrix_Zone.ZoneName='" + strZone + "'");
var DCName = oWMIService.Get(oZDCOutParams.DataCollector);
if (DCName.ServerName.toLowerCase() == NetbiosComputerName.toLowerCase()) {
isZDC = true
}
}
catch (ex)
{
// if we failed to get ZDC through WMI, try now MFCOM
var ZDCName = MFCOM_GetZDCName(strZone);
if (ZDCName.toLowerCase() == NetbiosComputerName.toLowerCase()) {
isZDC = true
}
}