检测Citrix XenDesktop会话

时间:2011-12-12 16:31:45

标签: session citrix terminal-services xendesktop

我希望确定我们的应用程序是在XenDesktop会话上运行而不是在本地运行。这是我到目前为止所发现的:


我们目前有代码来检测Citrix XenApp会话,类似于Helge Klein在" API for Determining if App is Running on Citrix or Terminal Services"中提到的解决方案。

遗憾的是,XenDesktop环境中的解决方案返回WTSClientProtocolType 0,表示本地控制台会话。

在回答同样的问题时,Josh Weatherly提到了检查sessionname环境变量。

但是,在XenDesktop环境中使用echo %sessionname%进行快速控制台检查会返回'控制台'。

来自" Detect citrix “application mode”?" John Sibly提出了一种检测远程会话的解决方案(特别是Citrix):

然而,

GetSystemMetrics(SM_REMOTESESSION)返回0,这也意味着它是本地会话。


有没有人知道检测它是XenDesktop会话的方法?到目前为止,您可以看到我的所有尝试都返回,该会话是本地控制台会话。

我使用XenDesktop Express 5.5,使用Citrix Receiver Web插件访问桌面。

2 个答案:

答案 0 :(得分:4)

如果您使用的是XenDesktop for VDI,那么就应用程序而言,应用程序 在本地执行。 VDI或虚拟桌面基础架构包括将GUI从全功能桌面操作系统提供给远程设备。通常,桌面O / S在数据中心中的管理程序上的虚拟机中执行,并且使用Citrix的ICA堆栈将GUI发送到远程设备。例如,这发生在池桌面场景中。

XenApp提供虚拟桌面,这是一个略有不同的概念。同样,桌面使用ICA堆栈传送到远程设备。但是,桌面不再在专用操作系统上运行。相反,它是单个Windows Server上的许多用户会话之一。可能有任意数量的用户登录到该服务器。这限制了可以运行的应用程序,这就是应用程序可能想要知道它们位于多用户操作系统上的原因。

您可能尝试做的是确定是否使用ICA堆栈远程传送GUI。一个简单的检查将涉及寻找“ProticaService”,它负责实现ICA堆栈。

或者,您可能正在尝试确定您的计算机是在VM中运行还是在计算机本机上运行。除了第一段中描述的池化场景外,XenDesktop还可以提供桌面运行本机。这克服了虚拟化I / O设备的限制,例如CAD应用程序使用的图形卡。在这种情况下,您需要排除VMM或虚拟机管理程序的存在。

答案 1 :(得分:3)

我已更新了问题中链接的answer,并说明了如何在XenDesktop会话中确定远程处理协议类型。

您需要Citrix的#{1}}功能WFGetActiveProtocol。 WFAPI SDK。请按以下步骤操作:

  1. 下载SDK(link
  2. 安装WFApiSDK64-65.msi
  3. 在您的C ++项目中包含wfapi.h并链接到wfapi[64].lib
  4. 使用未记录的函数WFGetActiveProtocol
  5. 更多细节和示例代码here