Citrix Deployment Discovery

Citrix.PresentationServer.DeploymentDiscovery (Discovery)

Discovers Citrix Presentation Server deployment

Element properties:

TargetCitrix.PresentationServer.ServerRole
EnabledTrue
Frequency3600
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource System.CommandExecuterDiscoveryDataSource Citrix.PresentationServer.CitrixAdministratorAccount

Source Code:

<Discovery ID="Citrix.PresentationServer.DeploymentDiscovery" Enabled="true" Target="Citrix.PresentationServer.ServerRole" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Citrix.PresentationServer.ManagedServer">
<Property PropertyID="ProductDescription"/>
<Property PropertyID="HotfixInfo"/>
<Property PropertyID="LicenseServer"/>
<Property PropertyID="LogonsEnabled"/>
<Property PropertyID="IsFMS"/>
<Property PropertyID="IsZDC"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Citrix.PresentationServer.UnlicensedServer"/>
<DiscoveryClass TypeID="Citrix.PresentationServer.UnsupportedServer">
<Property PropertyID="LicenseServer"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Citrix.PresentationServer.FarmMetricServer">
<Property PropertyID="ServerName"/>
<Property PropertyID="FarmName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Citrix.PresentationServer.ZoneDataCollector">
<Property PropertyID="ServerName"/>
<Property PropertyID="ZoneName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Citrix.PresentationServer.Farm">
<Property PropertyID="Name"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Citrix.PresentationServer.Zone">
<Property PropertyID="Name"/>
<Property PropertyID="NumberOfServers"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="CtxLibrary!Citrix.PresentationServer.CitrixAdministratorAccount" TypeID="System!System.CommandExecuterDiscoveryDataSource">
<IntervalSeconds>3600</IntervalSeconds>
<ApplicationName>%windir%\System32\cscript.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>//d $file/DiscoverServerRoles.js$ 0 $MPElement$ $Target/Host/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetbiosComputerName$ $Target/Property[Type="Citrix.PresentationServer.ServerRole"]/Name$</CommandLine>
<TimeoutSeconds>300</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>DiscoverServerRoles.js</Name>
<Contents><Script>
/*************************************************************************
*
*
*
*
* Copyright 2006-2008 Citrix Systems, Inc. All Rights Reserved.
*
*************************************************************************/

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;

if ( WScript.Arguments.Unnamed.Count == 6 )
{
SourceType = WScript.Arguments(0);
SourceID = WScript.Arguments(1) ;
ManagedEntityId = WScript.Arguments(2);
TargetComputer = WScript.Arguments(3);
NetbiosComputerName = WScript.Arguments(4);
ServerName = WScript.Arguments(5);
}
else
{
WScript.quit()
}

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 &lt; 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 = "&lt;error description not given&gt;";

str += ":\n\tReceived error: 0x" + num.toString(16) + ": " + estr;
}

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 &gt;= 4 &amp;&amp; minor &gt;= 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 &gt;= 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() &gt; 0)
{
// Get first hotfix name
var objHotfix = arrHotfixes.getItem( arrHotfixes.lbound(1) );
hotfixes = objHotfix.Name;

for (i = arrHotfixes.lbound(1) + 1; i &lt; 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
}
}

oInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ManagedServer']/IsFMS$", isFMS);
oInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ManagedServer']/IsZDC$", isZDC);

var loginsEnabled = false;
try
{
var oCPSServer = oWMIService.Get("MetaFrame_Server.ServerName='" + NetbiosComputerName + "'");
loginsEnabled = oCPSServer.LoginsEnabled;
}
catch (ex)
{
logError("WMI error retrieving Citrix Presentation Server info", ex);
loginsEnabled = false;
}

oInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ManagedServer']/LogonsEnabled$", loginsEnabled);
oDiscoveryData.AddInstance(oInst);
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.ManagedServer class", ex);

// Failed to connect to WMI service - try at least to submit registry based data
oDiscoveryData.AddInstance(oInst);
return;
}

// Create FMS instance
if (isFMS)
{
try
{
var oFMSInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.FarmMetricServer']$");
oFMSInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer);
oFMSInst.AddProperty("$MPElement[Name='CtxLibrary!Citrix.Library.ServerApplication']/Name$", ServerName);
oFMSInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.FarmMetricServer']/ServerName$", NetbiosComputerName);
oFMSInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.FarmMetricServer']/FarmName$", strFarm);
oDiscoveryData.AddInstance(oFMSInst)
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.FarmMetricServer class", ex);
}
}

//Create ZDC instance
if (isZDC)
{
try
{
var oZDCInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.ZoneDataCollector']$");
oZDCInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer);
oZDCInst.AddProperty("$MPElement[Name='CtxLibrary!Citrix.Library.ServerApplication']/Name$", ServerName);
oZDCInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ZoneDataCollector']/ServerName$", NetbiosComputerName);
oZDCInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.ZoneDataCollector']/ZoneName$", strZone);
oDiscoveryData.AddInstance(oZDCInst)
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.ZoneDataCollector class", ex);
}

// Create Citrix deployment instance
try
{
var deploymentSingletonInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='CtxLibrary!Citrix.Library.Deployment']$");
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.Deployment class", ex);
}

// Create farm instance
try
{
var oFarmInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.Farm']$");
oFarmInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.Farm']/Name$", strFarm);
oDiscoveryData.AddInstance(oFarmInst);
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.Farm class", ex);
}

try
{
var oDeploymentContainsFarm = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Citrix.PresentationServer.DeploymentContainsFarm']$");
oDeploymentContainsFarm.Source = deploymentSingletonInstance;
oDeploymentContainsFarm.Target = oFarmInst;
oDiscoveryData.AddInstance(oDeploymentContainsFarm);
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.DeploymentContainsFarm relationship class", ex);
}

try
{
var oZoneInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.Zone']$");
oZoneInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.Zone']/Name$", strFarm + ":" + oZDCOutParams.ZoneName);
oZoneInst.AddProperty("$MPElement[Name='Citrix.PresentationServer.Zone']/NumberOfServers$", oZDCOutParams.NumServersInZone);
oDiscoveryData.AddInstance(oZoneInst);
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.Zone class", ex);
}

// Farm contains zone
try
{
var oFarmContainsZone = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Citrix.PresentationServer.FarmContainsZone']$");
oFarmContainsZone.Source = oFarmInst;
oFarmContainsZone.Target = oZoneInst;
oDiscoveryData.AddInstance(oFarmContainsZone);
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.FarmContainsZone relationship class", ex);
}
}
}
else
{
//Create unlicensed server instance
try
{
var oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.UnlicensedServer']$");
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);
oDiscoveryData.AddInstance(oInst)
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.UnlicensedServer class", ex);
return;
}
}
}
else
{
// Create unsupported server instance
try
{
var oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='Citrix.PresentationServer.UnsupportedServer']$");
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.UnsupportedServer']/LicenseServer$", strLicenseSrv);
oDiscoveryData.AddInstance(oInst)
}
catch (ex)
{
logError("Failed to create an instance of Citrix.PresentationServer.UnsupportedServer class", ex);
return;
}
}

// Submit discovery data
oAPI.Return(oDiscoveryData);
}

Main();

</Script></Contents>
</File>
</Files>
</DataSource>
</Discovery>