Detecting a Citrix XenDesktop Session

6k views Asked by At

I'm looking to determine if our application is running on a XenDesktop session rather than locally. Here is what I have found so far:


We currently have code to detect a Citrix XenApp session similar to the solution mentioned by Helge Klein in "API for Determining if App is Running on Citrix or Terminal Services".

Sadly that solution in a XenDesktop environment is returning back a WTSClientProtocolType of 0 which signifies a local console session.

In response to the same question Josh Weatherly mentioned checking the sessionname environment variable.

However a quick console check with echo %sessionname% on the XenDesktop environment returns back 'Console'.

From "Detect citrix “application mode”?" John Sibly suggested a solution for detecting a remote session (not Citrix in particular):

GetSystemMetrics(SM_REMOTESESSION) however returns 0 which also means that it is a local session.


Does anyone know of a way to detect that it is a XenDesktop session? So far as you can see all my attempts are returning that the session is a local console session.

I'm using XenDesktop Express 5.5, accessing the desktop using the Citrix Receiver Web Plug-In.

2

There are 2 answers

1
Donal Lafferty On BEST ANSWER

If you are using XenDesktop for VDI, then as far as the application is concerned, the application is executing locally. VDI, or virtual desktop infrastructure, consists of delivering the GUI from a full featured desktop operating system to a remote device. Typically, the desktop O/S executes in a virtual machine on a hypervisor in a data center, and the GUI is transmitted to the remote device using Citrix' ICA stack. For example, this happens in the pooled desktops scenario.

XenApp offers virtual desktops, which is a slightly different concept. Again, the desktop is delivered to a remote device using the ICA stack. However, the desktop is no longer running on a dedicated O/S. Rather, it is one of a number of user sessions on a single Windows Server. There may be any number of users logged on to that server. This places limits on the applications that can be run, which is why applications might want to know that they are on a multi-user O/S.

What you might try to do is determine whether the GUI is being delivered remotely using the ICA stack. A simple check would involve looking for the "ProticaService", which is responsible for implementing the ICA stack.

Alternatively, you may be trying to determine if your machine is running in a VM or native to a machine. Besides the pooled scenario described in the first paragraph, XenDesktop can deliver desktop running native. This overcomes limits on virtualision I/O devices such as graphics cards used by CAD applications. In this case, you need to rule out the presence of a VMM, or hypervisor.

0
Helge Klein On

I have updated my answer linked to in the question with a description of how to determine the remoting protocol type in XenDesktop sessions.

You need the (not really well documented) function WFGetActiveProtocol from Citrix' WFAPI SDK. Proceed as follows:

  1. Download the SDK (link)
  2. Install WFApiSDK64-65.msi
  3. In your C++ project include wfapi.h and link to wfapi[64].lib
  4. Use the undocumented function WFGetActiveProtocol

More detail and sample code here.