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.
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.
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:
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:
WTSQuerySessionInformation
auf. Wenn das 1 oder 2 (ICA oder RDP) zurückgibt, sind Sie fertig. WTSQuerySessionInformation
0 (Konsole) zurückgibt, lade wfapi.dll
dynamisch und erhalte die Adresse von WFGetActiveProtocol
WFGetActiveProtocol
mit einem Parameter von WF_CURRENT_SESSION
auf, der als ((DWORD) -1) WFGetActiveProtocol
ist der Sitzungstyp. Es sollte entweder 0 (Konsole) oder 1 (ICA) 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.
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!
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.
Tags und Links api vb.net citrix terminal-services