如何判断C# App 运行是否在Citrix下

How to Determine Whether C# App Running Under Citrix

我有一个 C# WPF 应用程序可以 运行 在 2 种模式下。第一个是通过 Citrix,第二个是在本地直接安装和 运行ning。

这个应用程序很旧,我们正在使用对 windows 远程桌面 API、WTSQuerySessionInformation 的调用来确定我们是否 运行ning over Citrix。

https://msdn.microsoft.com/en-us/library/aa383838(v=vs.85).aspx

电话基本上是这样的,

hRet = WTSQuerySessionInformation(WF_CURRENT_SERVER_HANDLE, WF_CURRENT_SESSION,
            WTS_INFO_CLASS.WTSApplicationName, ref ppBuffer, ref iBytesReturned);

所以它在当前远程桌面会话中返回应用程序名称,并且假设如果没有应用程序名称那么它就不会 运行ning 在 Citrix 下。

这不再有效,因为我们升级了我们正在使用的 Citrix 版本。上面的调用returns一个空字符串。

问题是,

  1. 为什么这个调用不起作用
  2. 是否有更好的方法来确定 C# 应用程序是否 运行宁在 Citrix 上?

我们使用这个:

var sessionName = (Environment.GetEnvironmentVariable("SessionName") ?? "").ToUpper();
return sessionName.StartsWith("ICA") || sessionName.StartsWith("RDP");

其中 ICA 推断 Citrix、RDP 远程桌面。

坚持原来的方法是可行的,但我查询的不是 WTSApplicationName,而是 WTSClientProtocolType。

所以我调用 WTSQuerySessionInformation,并将第三个参数设置为 WTSClientProtocolType。还有这个returns,

0 for console sessions
1 for ICA sessions
2 for RDP sessions