用于确定应用程序是否在Citrix或终端服务上运行的API

Joh*_*ruz 8 vb.net api citrix terminal-services

我正在寻找一个API /函数,我可以调用它来确定软件是在Citrix,终端服务还是独立PC上运行.最理想的是,它可以像这样工作:

Select Case APIWhatSystem.Type.ToString
   Case "Citrix"
      bCitrix = True
   Case "TS"
      bTerminalServices = True
   Case "PC"
      bPC = True
End Select
Run Code Online (Sandbox Code Playgroud)

我更喜欢通过API调用工作的东西,而不是在注册表中查看某些东西,因为我们有越来越多的客户锁定注册表.

谢谢.

Hel*_*ein 14

有一个API函数可以让您确定特定用户会话是在控制台上(本地)还是通过远程协议Citrix ICA(现在称为HDX)或Microsoft RDP.

调用WTSQuerySessionInformation,将第3个参数设置为WTSClientProtocolType.该函数返回:

  • 0表示控制台会话
  • 1为ICA会议
  • 2用于RDP会话

有趣的是,1的返回值不再记录WTS_PROTOCOL_TYPE_ICA在MSDN(上面的第二个链接)上,而是"为了传统目的而保留此值".

更新:

无法检测到XenDesktop会话WTSQuerySessionInformation(它返回0,表示控制台).如果您想要通用解决方案:

  • 打电话WTSQuerySessionInformation.如果返回1或2(ICA或RDP),则完成.
  • 如果WTSQuerySessionInformation返回0(控制台),则动态加载wfapi.dll并获取地址WFGetActiveProtocol
  • WFGetActiveProtocol使用参数调用,WF_CURRENT_SESSION定义为((DWORD)-1)
  • 返回值WFGetActiveProtocol是会话类型.它应该是0(控制台)或1(ICA)

我在这里详细描述了该过程以及C++代码示例和返回当前会话的远程协议类型的工作编译工具.


Jos*_*rly 7

根据:http://forums.citrix.com/message.jspa?messageID = 1363711,您可以检查SESSIONNAME环境变量.

另一种更简单的方法是读取系统环境变量"SESSIONNAME".如果它存在并以"ICA"开头,那么您将在Citrix会话中运行.如果它以"RDP"开头,那么您将在RDP会话中运行.

我用我的电脑和我在本地测试了它:

C:\>echo %SESSIONNAME%
Console
Run Code Online (Sandbox Code Playgroud)

虽然远程我得到了

C:\>echo %SESSIONNAME%
RDP-tcp1
Run Code Online (Sandbox Code Playgroud)

因此,似乎它可能是一个简单的路径,否则听起来像检查注册表值或如果存在某些dll将是下一个最好的事情.