如何在 Citrix XenApp 6.0 上获取唯一的客户端 ID?(4.0 和 4.5 的 MFCom 不起作用)



当前对于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:

  1. 使用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个独立的系统服务崩溃。。。所以也许不会
  2. 另一种选择(以及我使用的技术)是使用Citrix WFAPI SDK。它是非托管代码,有点像猪,但这里有一篇关于使用WFAPI获取客户端详细信息的非常好的文章

最新更新