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.该函数返回:
有趣的是,1的返回值不再记录WTS_PROTOCOL_TYPE_ICA在MSDN(上面的第二个链接)上,而是"为了传统目的而保留此值".
更新:
无法检测到XenDesktop会话WTSQuerySessionInformation(它返回0,表示控制台).如果您想要通用解决方案:
WTSQuerySessionInformation.如果返回1或2(ICA或RDP),则完成.WTSQuerySessionInformation返回0(控制台),则动态加载wfapi.dll并获取地址WFGetActiveProtocolWFGetActiveProtocol使用参数调用,WF_CURRENT_SESSION定义为((DWORD)-1)WFGetActiveProtocol是会话类型.它应该是0(控制台)或1(ICA)我在这里详细描述了该过程以及C++代码示例和返回当前会话的远程协议类型的工作编译工具.
根据: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将是下一个最好的事情.