【问题标题】:How to Determine Whether C# App Running Under Citrix [duplicate]如何确定 C# 应用程序是否在 Citrix 下运行 [重复]
【发布时间】:2015-10-07 20:30:54
【问题描述】:

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

这个应用程序很旧,我们正在使用对 Windows 远程桌面 API WTSQuerySessionInformation 的调用来确定我们是否在 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);

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

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

问题是,

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

【问题讨论】:

  • 对于您的情况,“特征检测”可能比“环境检测”更好。但是在不知道为什么需要这两种模式的情况下,我无法猜测。我的意思是,例如,detect whether 3D acceleration is available or not,如果这是缺少它,这是您需要的根本原因。
  • 比这简单得多。如果它在本地机器上运行,则应用程序需要从本地机器上的特定位置读取一些文件。如果它在 citrix 上运行,则需要从共享驱动器加载相同的文件。
  • 如果服务器上的应用程序需要远程获取文件,即使在服务器上本地打开会话以启动它(假设您的服务器可以),那么文件路径可以在本地配置文件/注册表项。

标签: c# wpf citrix


【解决方案1】:

我们使用这个:

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

ICA 推断 Citrix、RDP 远程桌面的位置。

【讨论】:

  • 很好的答案,它帮助了我。我不明白为什么它的评分这么低(-1)。
【解决方案2】:

坚持使用原始方法有效,但不是查询 WTSApplicationName,而是查询 WTSClientProtocolType。

所以我调用 WTSQuerySessionInformation 并将第三个参数设置为 WTSClientProtocolType。这又回来了,

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

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多