AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Terminalserver-Betrieb unter 64bit erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

Terminalserver-Betrieb unter 64bit erkennen

Ein Thema von mfahs · begonnen am 22. Sep 2014 · letzter Beitrag vom 21. Feb 2015
Antwort Antwort
mfahs

Registriert seit: 18. Jul 2012
10 Beiträge
 
#1

Terminalserver-Betrieb unter 64bit erkennen

  Alt 22. Sep 2014, 17:19
Hallo!

Ich habe mit der "JEDI API 2.3" ein paar Routinen erstellt, mit denen ich seit Jahren ganz prima herausfinden kann, ob eine Anwendung auf einem Terminalserver gestartet wird und wie in diesem Fall der Name der tatsächlichen Workstation (also der am TS angemeldeten Maschine!) lautet. Das läuft - wie schon erwähnt - seit Jahren einwandfrei.

Nun hat mich vor einiger Zeit der Teufel geritten und ich hatte das "Bedürfnis", eine reine 64-Bit-Anwendung mit Delphi XE6 zu erstellen.
Von einigen anderen Dingen abgesehen (die ich alle entsprechend anpassen kann), ist es mir bisher nicht gelungen, die oben erwähnten Funktionen auch unter 64bit zum Laufen zu bringen.

Wie gesagt: Ich muss herausfinden können, ob eine Anwendung überhaupt auf einem TS gestartet wird und - wenn das der Fall ist - wie der Rechner heißt, der am TS angemeldet ist. Der Name des TS selbst ist mir völlig egal, es geht um den Arbeitsplatz, an dem der Anwender sitzt!

Hat jemand eine Idee, mit welchen Tricks und/oder Hilfsmitteln das unter 64bit rauszubekommen ist?

Besten Dank schon mal für die vielen tollen Ideen

Martin
  Mit Zitat antworten Zitat
WilliWinzig

Registriert seit: 10. Jul 2011
Ort: Berlin/Brandenburg
9 Beiträge
 
Delphi 12 Athens
 
#2

AW: Terminalserver-Betrieb unter 64bit erkennen

  Alt 22. Sep 2014, 18:41
Die Antwort lautet:

Delphi-Quellcode:
uses System.SysUtils;
.....

function isTSClient: Boolean;
var cClient : String;
begin

cClient:= Trim(GetEnvironmentVariable('CLIENTNAME'));

Result:= Length(cClient) > 0;
end;
Die Funktion liefert allerdings auch bei RDP-Zugriff auf normalen PC's "TRUE" zurück
da Clientname immer bei RDP-Verbindungen gesetzt wird.

MfG
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

AW: Terminalserver-Betrieb unter 64bit erkennen

  Alt 22. Sep 2014, 21:10
Alternativ kannst Du anstatt der "CLIENTNAME" die Umgebungsvariable "SESSIONNAME" abfragen.

Der Verhalten ist dort wie folgt:
SESSIONNAME=Console
(User arbeitet lokal oder die RDP Session ist als Console gestartet (mit mstsc -admin). Für die Admin Session braucht man wenigstens lokale Admin Rechte auf dem Zielserver und es ist nur eine Consolen Session zur Zeit pro Server möglich.

SESSIONNAME=RDP-Tcp#nnn (nnn = Sessionnummer)
(User arbeitet per RDP Client auf einem Terminalserver.)

SESSIONNAME=ICA-Tcp#nnn (nnn = Sessionnummer)
(User arbeitet per Citrix ICA / XenApp Client auf einem Citrix Terminalserver.)
  Mit Zitat antworten Zitat
mfahs

Registriert seit: 18. Jul 2012
10 Beiträge
 
#4

AW: Terminalserver-Betrieb unter 64bit erkennen

  Alt 22. Sep 2014, 22:47
Besten Dank für die Tipps. Das sieht tatsächlich ganz gut aus!
Dann werde ich meine Routinen mal umstellen.

Danke!

Martin
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#5

AW: Terminalserver-Betrieb unter 64bit erkennen

  Alt 20. Feb 2015, 17:44
In my opinion reading the environment variable is the wrong way as there's no guarantee that the variable will be set.
The "proper" way is to call the GetSystemMetrics API with the SM_REMOTESESSION parameter.

Zitat:
This system metric is used in a Terminal Services environment. If the calling process is associated with a Terminal Services client session, the return value is nonzero. If the calling process is associated with the Terminal Services console session, the return value is 0.
Windows Server 2003 and Windows XP: The console session is not necessarily the physical console. For more information, see WTSGetActiveConsoleSessionId.
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#6

AW: Terminalserver-Betrieb unter 64bit erkennen

  Alt 21. Feb 2015, 15:57
Hallo..

Envoimentvariablen sollten besser nicht genutzt werden.

Wie bereits gesagt, kann da alles liegen, gerade in TherminalServer-Umgebungen wird dort oft durch loginScripte anderes eingetragen.

Hier eine Routine, welche funktioniert, mit Delphi6 - XE6.

Code:
uses
  Windows, wtsapi32;


function ProcessIdToSessionId(dwProcessId: DWORD;var pSessionId: DWORD): BOOL; stdcall; external kernel32 name 'ProcessIdToSessionId';


function GetPCSystemName : WideString;
var
  lpBuf : PWideChar;
  nSi : DWORD;
begin
  Result := '';
  nSi := (1024 + 2) * SizeOf(WideChar);
  GetMem(lpBuf, nSi);
  try
    if GetComputerNameW(lpBuf, nSi) then Result := lpBuf;
  finally
    FreeMem(lpBuf);
  end;
end;

function GetPCClientName : WideString;
var
  nProcessID, nSessionID : DWORD;
  nByteCount : DWORD;
  acNameBuff : Pointer;
  tmpName   : WideString;
begin
  // Lokaler HostName
  Result := GetPCSystemName;
  nProcessID := GetCurrentProcessId;
  nSessionID := 0;
  //PROCESS_QUERY_INFORMATION wird benötigt für ProcessIdToSessionID         "SeDebugPrivilege"
  // SessionID von aktueller ProcessID
  if ProcessIdToSessionID( nProcessID, nSessionID) then begin
    // Wenn in einer Session..
    if nSessionID > 0 then begin
      // Session ClientName
      if WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, nSessionId, WTSClientName, acNameBuff, nByteCount) then begin
        try
          tmpName := PWideChar(acNameBuff);
          // Da bei Vista kein Name vorhanden ist, auf Leerstring prüfen!
          if tmpName <> '' then
            result := tmpName;
        finally
          WTSFreeMemory(acNameBuff);
        end;
      end;
    end;
  end;
end;

Mit ProcessIdToSessionId Kannst Du ermitteln, ob deine App in einer Therminal-Session läuft und dann kannste mit WTSQuerySessionInformationW den ClientSession-Name auslesen.

Dies funktioniert (getestet) ab WinXP bis zu Win8.1 (64Bit).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz