当前对于Presentation Server 4.0和4.5,我正在通过C#.NET中的MFCom获取唯一的客户端ID。
MetaFrameFarm farm = new MetaFrameFarm();
farm.Initialize(MetaFrameObjectType.MetaFrameWinFarmObject);
foreach (MetaFrameSession session in farm.Sessions)
{
clientId = session.ClientID;
.....
我开始在6.0上进行错误测试。失败的行是实例化上面的对象"farm"的第一行。
在网上我发现了这个。。。
在XenApp 6.0中启动,MFCOM作为公共支持的编程和脚本接口将不再是可获得的所有现有的基于MFCOM的代码不再适用于XenApp 6.0。不怀疑MFCOM的缺席是需要额外的东西努力采用XenApp 6.0。
有没有办法在6.0中获得唯一的客户端ID?
这已经很旧了,但当我想获得clientID时,我一直会遇到这个问题。
请记住,4.X中的ClientID似乎与6.X的格式不同。这适用于所有ID、应用程序和服务器:
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
PSSnapInException ex;
rs.RunspaceConfiguration.AddPSSnapIn("Citrix.XenApp.Commands", out ex);
ps.AddCommand("GET-XASession").AddParameter("Full");
foreach (PSObject Session in ps.Invoke())
{
try
{
ClientID = Convert.ToString(Session.Properties["ClientId"].Value);
Console.WrileLine(ClientID);
}
catch (Exception e)
{
WriteError.WriteEntry("Client Failure " + e.Message + EventLogEntryType.FailureAudit);
}
}
正如您正确确定的那样,MFCOM在XenApp 6上不可用。因此,只有两种方法可以获得唯一的ClientID:
-
使用Citrix WMI子系统从您的应用程序中,连接到Root\SCitrix WMI命名空间并枚举MetaFrame_Session类的实例。您可以按服务器名称(因为枚举将返回所有场服务器上的所有会话,而不仅仅是您运行应用程序的服务器)和会话ID进行筛选。Metaframe_session类的实例包含两个属性,这些属性是对其他类实例的引用;Client属性引用Metaframe_ ICA_ Client并且SessionUser属性引用Citrix_。Metaframe_ICA_Client为您提供客户端的IP地址、主机名和其他一些可以组合为ID的东西。
然而,目前XenApp 6在Citrix WMI子系统中有一个巨大的错误,试图枚举和实例化我在上面引用的类(作为一个普通用户-管理员很好)会导致不少于15个独立的系统服务崩溃。。。所以也许不会 - 另一种选择(以及我使用的技术)是使用Citrix WFAPI SDK。它是非托管代码,有点像猪,但这里有一篇关于使用WFAPI获取客户端详细信息的非常好的文章