5

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


我们目前有检测 Citrix XenApp 会话的代码,类似于 Helge Klein 在“用于确定应用程序是否在 Citrix 或终端服务上运行的 API ”中提到的解决方案。

遗憾的是,XenDesktop 环境中的解决方案正在返回一个表示本地控制台会话的 a WTSClientProtocolType0

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

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

来自“ Detect citrix”应用程序模式? ”John Sibly 提出了一种检测远程会话的解决方案(特别是不是 Citrix):

GetSystemMetrics(SM_REMOTESESSION)然而返回 0 这也意味着它是一个本地会话。


有谁知道检测它是 XenDesktop 会话的方法吗?就您所见,我所有的尝试都返回该会话是本地控制台会话。

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

4

2 回答 2

4

如果您将 XenDesktop 用于 VDI,那么就应用程序而言,该应用程序正在本地执行。VDI 或虚拟桌面基础架构包括将 GUI 从功能齐全的桌面操作系统交付到远程设备。通常,桌面操作系统在数据中心管理程序上的虚拟机中执行,GUI 使用 Citrix 的 ICA 堆栈传输到远程设备。例如,这发生在池桌面方案中。

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

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

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

于 2012-01-17T14:06:53.230 回答
3

我已经更新了我在问题中链接的答案,其中描述了如何确定 XenDesktop 会话中的远程协议类型。

您需要 Citrix 的 WFAPI SDK 中的(没有很好记录的)功能WFGetActiveProtocol。进行如下操作:

  1. 下载 SDK(链接
  2. 安装WFApiSDK64-65.msi
  3. 在您的 C++ 项目中包含wfapi.h并链接到wfapi[64].lib
  4. 使用未记录的功能WFGetActiveProtocol

更多细节和示例代码在这里

于 2014-08-06T18:18:19.963 回答