API zum Ermitteln, ob App auf Citrix- oder Terminaldiensten ausgeführt wird [geschlossen]

8

Ich bin auf der Suche nach einer API / Funktion, die ich aufrufen kann, um festzustellen, ob Software auf Citrix, Terminaldiensten oder einem eigenständigen PC läuft. Im Idealfall würde es so ähnlich funktionieren:

%Vor%

Ich würde etwas bevorzugen, das von einem API-Aufruf funktioniert, anstatt etwas in der Registrierung zu betrachten, da wir immer mehr Kunden haben, die die Registrierung sperren.

Danke.

    
John Cruz 15.11.2010, 15:57
quelle

4 Antworten

6

Nach: Ссылка können Sie die Umgebungsvariable SESSIONNAME überprüfen.

  

Ein anderer einfacher Weg ist, die Systemumgebungsvariable "SESSIONNAME" zu lesen. Wenn es existiert und mit "ICA" beginnt, dann laufen Sie innerhalb einer Citrix Sitzung. Wenn es mit "RDP" beginnt, dann laufen Sie innerhalb einer RDP-Sitzung.

Ich habe es mit meinem PC getestet und lokal bekomme ich:

%Vor%

In der Ferne habe ich

%Vor%

Es scheint also, als ob es ein einfacher Weg zu gehen ist, sonst hört es sich an, als würde man nach Registry-Werten suchen oder wenn bestimmte DLLs existieren, wäre das nächstbeste.

    
Josh Weatherly 15.11.2010, 16:12
quelle
11

Es gibt eine API-Funktion, mit der Sie bestimmen können, ob eine bestimmte Benutzersitzung auf der Konsole (lokal) oder über eines der Remoting-Protokolle Citrix ICA (heute HDX) oder Microsoft RDP angezeigt wird.

Rufen Sie WTSQuerySessionInformation mit dem dritten Parameter auf WTSClientProtocolType ." Die Funktion gibt zurück:

  • 0 für Konsolensitzungen
  • 1 für ICA-Sitzungen
  • 2 für RDP-Sitzungen

Interessanterweise ist der Rückgabewert von 1 nicht mehr als WTS_PROTOCOL_TYPE_ICA auf MSDN (zweiter Link oben) dokumentiert, sondern als "Dieser Wert wird für ältere Zwecke beibehalten.".

Aktualisierung:

XenDesktop -Sitzungen können nicht mit WTSQuerySessionInformation erkannt werden (es gibt 0 zurück, dh Console). Wenn Sie eine universelle Lösung wollen:

  • Rufen Sie WTSQuerySessionInformation auf. Wenn das 1 oder 2 (ICA oder RDP) zurückgibt, sind Sie fertig.
  • Wenn WTSQuerySessionInformation 0 (Konsole) zurückgibt, lade wfapi.dll dynamisch und erhalte die Adresse von WFGetActiveProtocol
  • Rufen Sie WFGetActiveProtocol mit einem Parameter von WF_CURRENT_SESSION auf, der als ((DWORD) -1)
  • definiert ist
  • Der Rückgabewert von WFGetActiveProtocol ist der Sitzungstyp. Es sollte entweder 0 (Konsole) oder 1 (ICA)
  • sein

Ich habe den Prozess im Detail hier zusammen mit einem C ++ - Codebeispiel beschrieben und ein funktionierendes kompiliertes Tool, das den Remoteprotokolltyp der aktuellen Sitzung zurückgibt.

    
Helge Klein 15.11.2010 21:28
quelle
3

Nach @ Joshs Antwort würde der Code so aussehen:

%Vor%

Ich habe es noch nicht vollständig getestet, aber es sieht so aus, als würde es tun, was ich will. PCs und Terminalserver meldet korrekt.

Wenn jemand eine Möglichkeit hat, dies in einer Citrix-Box zu testen, wäre das sehr zu empfehlen!

    
John Cruz 15.11.2010 21:19
quelle
2

Basierend auf Helge Kleins überarbeiteter Antwort (oben) dachte ich, ich würde den VBA-Code veröffentlichen, um dies zu ermöglichen, damit zukünftige VBA-Benutzer diese Seite erreichen können. Helge hat bereits den C ++ Code auf seiner eigenen Seite. Wenn Sie dies hilfreich finden, bitte Upgeote Helge Kleins Antwort.

%Vor%

Ich habe dies auf XenApp und XenDesktop getestet.

    
DHW 08.08.2014 15:27
quelle