Session 检测Citrix XenDesktop会话

Session 检测Citrix XenDesktop会话,session,citrix,terminal-services,xendesktop,Session,Citrix,Terminal Services,Xendesktop,我希望确定我们的应用程序是否在XenDesktop会话上运行,而不是在本地运行。以下是我到目前为止的发现: 我们目前拥有检测Citrix XenApp会话的代码,类似于Helge Klein在“”中提到的解决方案 遗憾的是,XenDesktop环境中的解决方案返回了0的WTSClientProtocolType,这表示本地控制台会话 在回答相同的问题时,Josh Weatherly提到检查sessionname环境变量 但是,在XenDesktop环境上使用echo%sessionname%快

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


我们目前拥有检测Citrix XenApp会话的代码,类似于Helge Klein在“”中提到的解决方案

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

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

但是,在XenDesktop环境上使用echo%sessionname%快速检查控制台会返回“控制台”

从“”中,John Sibly提出了一种检测远程会话的解决方案(特别是Citrix):

GetSystemMetrics(SM\u REMOTESESSION)
但是返回0,这也意味着它是本地会话


有人知道一种检测XenDesktop会话的方法吗?就您所见,我的所有尝试都返回到会话是本地控制台会话


我使用的是XenDesktop Express 5.5,使用Citrix接收器Web插件访问桌面。

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

XenApp提供虚拟桌面,这是一个稍微不同的概念。同样,使用ICA堆栈将桌面传送到远程设备。但是,桌面不再在专用O/S上运行。相反,它是单个Windows服务器上多个用户会话之一。可能有任意数量的用户登录到该服务器。这限制了可以运行的应用程序,这就是为什么应用程序可能希望知道它们位于多用户O/S上

您可以尝试做的是确定GUI是否正在使用ICA堆栈远程交付。一个简单的检查需要寻找“ProticaService”,它负责实现ICA堆栈

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

我已更新了问题中的链接到,并介绍了如何确定XenDesktop会话中的远程处理协议类型

您需要Citrix的WFAPI SDK中的函数
WFGetActiveProtocol
(没有很好的文档)。进行如下工作:

  • 下载SDK()
  • 安装WFApiSDK64-65.msi
  • <> LI>在C++项目中包含<代码> WFAPI .H/COD>和链接到代码> WFAPI(64)。
  • 使用未记录的函数
    WFGetActiveProtocol

  • 更多详细信息和示例代码。

    感谢您的回复。最后,我们对Citrix桌面服务(WorkstationAgent)进行了类似的简单检查,以您的ProticService建议为准。例如,Citrix SDK在其
    WFAPI SDK
    中提到了
    WFQuerySessionInformation