8
votes

API pour déterminer si l'application est en cours d'exécution sur Citrix ou Terminal Services

Je recherche une API / Fonction, je peux appeler pour déterminer si le logiciel s'exécute sur Citrix, Terminal Services ou un PC autonome. De manière optimale, cela fonctionnerait quelque chose comme ceci:

Select Case APIWhatSystem.Type.ToString
   Case "Citrix"
      bCitrix = True
   Case "TS"
      bTerminalServices = True
   Case "PC"
      bPC = True
End Select


3 commentaires

J'ai trouvé cela ... Systeminformation.terminalserversession qui retourne la valeur booléenne, afin de répondre à la question TS. Je ne sais pas si cela renvoie Bool pour Citrix. Encore enquêter.


Je l'ai trouvé true pour Citrix et Windows 2008 Server TS ThinApp.


Citrix SDK mention wfquerysessionInformation dans leur wfapi sdk par exemple citrix.com/content/dam/citrix/en_us/documents/downloads/sdk/ ...


4 Réponses :


8
votes

Selon: http://forums.caitrix.com/message.jspa?messageid = 1363711 Vous pouvez vérifier la variable d'environnement de nom de session.

Un autre moyen plus simple est de lire la variable d'environnement système "Nom de la session". Si cela existe et commence par "ICA", alors vous utilisez une session Citrix. Si cela commence par "RDP", vous utilisez une session RDP. P> BlockQuote>

Je l'ai testé avec mon PC et je reçois localement: p> xxx pré>

tandis que je suis à distance, j'ai reçu p>

C:\>echo %SESSIONNAME%
RDP-tcp1


0 commentaires

2
votes

Suivre la réponse de @ Josh, le code ressemblerait à ceci:

Select Case Environment.GetEnvironmentVariable("SessionName").ToUpper.SubString(0,3))
   Case "ICA" 
      bCitrix = True
   Case "RDP"
      bTerminalServer = True
   Case "CON" 
      bPC = True
End Select


3 commentaires

Travaille pour moi. Sur mon serveur Citrix ? Environ ("Nom de session") retourne ICA-TCP # 56 .


Avis, que dans Windows 2008 TS RemoteApp mode, cette env.Variable est absente


Je viens de courir ceci sur mon infrastructure et je reçois la sessionName = console, il semble donc ne pas être une méthode fiable.



15
votes

Il existe une fonction d'API qui vous permet de déterminer si une session d'utilisateur spécifique est affichée sur la console (localement) ou via l'une des protocoles de télécommande Citrix ICA (aujourd'hui appelé HDX) ou Microsoft RDP.

Call WTSQuerySessionInformation avec 3ème jeu de paramètres to WTSClientProtocoltype . La fonction renvoie:

  • 0 pour les sessions de console
  • 1 pour les sessions ICA
  • 2 pour Sessions RDP

    intéressant de manière intéressante la valeur de retour de 1 n'est pas documentée comme wts_protocol_type_ica sur MSDN (deuxième lien ci-dessus), mais comme "cette valeur est conservée à des fins héritées.".

    mise à jour:

    xendesktop Les sessions ne peuvent pas être détectées avec wtsquerysessionInformation (il renvoie 0, Signification console). Si vous voulez une solution universelle:

    • appelez wtsquerysessionInformation . Si cela retourne 1 ou 2 (ICA ou RDP), vous avez terminé.
    • Si wtsQuiserysessionInformation retourne 0 (console), chargez de manière dynamique wfapi.dll et obtenez l'adresse de wfgetactiveprotocol
    • appel wfgetactiveprotocol avec un paramètre de wf_current_session , qui est défini comme ((DWORD) -1)
    • La valeur de retour de wfgetactiveprotocol est le type de session. Il devrait être soit 0 (console) ou 1 (ICA)

      J'ai décrit le processus en détail ici le long de avec un échantillon de code C ++ et un outil compilé de travail qui renvoie le type de protocole de télécommande de la session actuelle.


12 commentaires

Pensez-vous qu'il serait prudent de supposer si cette fonction renvoie un nombre supérieur à 0, l'application ne s'exécute pas sur un PC? c'est à dire. Il doit être exécuté sur une sorte de serveur. Je pense comme 5 ans dans le futur ... de la manière dont un non-zéro devrait toujours indiquer autre chose qu'un PC, non?


Oui, je pense que si elle serait sûre de supposer que quelque chose> 0 est ... pas local. Veuillez noter la différence de libellé. Il peut très bien courir sur un PC, mais avec le sujet brûlant d'aujourd'hui "VDI" de bureau virtuel servi sur certains protocoles de télécommande (Think 2008 R2 SP1 - REMISTOFX) La probabilité augmente régulièrement des PC devenant bientôt des serveurs Terminal de la session.


Si l'application est exécutée sous Citrix XenApp, WTSClientProtocolType retournera 1. Si, toutefois, l'application est exécutée sous Citrix Xendesktop, puis WTSClientProtocoltype retournera 0. Je cherche toujours un moyen de le détecter qui ne consiste pas à énumérer le appareils et à la recherche de pilotes virtuels connus.


@DHW: XenApp et Xendesktop sont fondamentalement différents de la manière dont ils interface avec le système d'exploitation. Alors que XenApp indique officiellement le système d'exploitation qu'il utilise un protocole de télécommandage Xendesktop redirige la session de la console. La session d'utilisateur n'est donc pas une session WTS et WTSQuerySessionInformation ne vous aide pas. Vous devriez poser une autre question concernant Xendedesktop.


@Helgeklein Il y a beaucoup de sites Web retransignant à votre solution ici - et un certain nombre de ces sites demandent exactement ce que je demande - alors je pense que ma solution non si soignée fera. J'ai vérifié les clés de registre présentes sur le bureau virtualisé pour Xendedesktop 2.0 et la comparé à ceux qui sont toujours en jeu dans la version actuelle. Je me suis installé sur des tests pour l'existence de HKEY_LOCAL_MACHINE \ Software \ Citrix \ VirtualdesktopAgent - Votre solution revient donc avec la console, je vérifierai la clé de registre. Si cela existe, je conclus sa citrice. Assez proche pour toutes les raisons pratiques.


@DHW: Cela semble assez bon pour moi.


@DHW: J'ai maintenant une meilleure solution pour XendeSktop et mis à jour ma réponse en conséquence.


@Helgeklein Je ne suis pas sûr sur les spécificités de la mise en œuvre XenDesktop - mais wfapi.dll n'existe pas dans la construction XenDesktop que j'utilise.


@DHW: quelle version de xendesktop est-ce? Pour être plus spécifique: la version du logiciel VDA installé sur les machines virtuelles Windows est pertinente.


XENDESKTOP 5.6. Win7. Je ne sais pas si c'est pertinent mais son lancé à l'aide de l'agent de quartier du programme (pnagent)


@DHW: Je viens de vérifier sur une machine Windows 7 x64 avec le XENDESKTOP 5.6 VDA installé. Wfapi.dll et wfapi64.dll sont dans le sous-répertoire "icaService" du répertoire d'installation VDA. Il devrait également être sur le chemin afin de pouvoir le trouver sur la console avec "où wfapi.dll".


@Helgeklein ah. Le voir. C: \ Fichiers de programme \ Citrix \ icaService \ wfapi.dll Je cherchais dans Windows Tree.



2
votes

Basé sur la réponse révisée de Helge Klein (ci-dessus), je pensais poster le code VBA pour que cela aide à aider les futurs utilisateurs VBA frappant cette page. Helge a déjà le code C ++ sur son propre site. Si vous trouvez cela utile, s'il vous plaît uplotez la réponse de Helge Klein. XXX

J'ai testé ceci sur XenApp et Xendesktop.


0 commentaires