Einzelnen Beitrag anzeigen

daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#1

Windows Sessions ermitteln mit WTSEnumerateSessions

  Alt 10. Nov 2011, 14:57
Ich möchte in einer Terminalserver-Umgebung eine Kommunikation zwischen Server und Client aufbauen und scheitere schon an der ersten Hürde, die ich gerade zur Vorbereitung bearbeite:

Und zwar möchte ich die in der Windowsumgebung aktiven Sessions ermitteln und ausgeben lassen. Hierzu habe ich durch intensiven Google-Einsatz den nachfolgenden Programmcode geschrieben. Mit dem kann ich die Zahl der Sessions auch ermitteln, beim Zugriff auf die Session ID und den Namen gibt es aber eine Exception, sobald die zweite Session ausgegeben wird. Vermutlich habe ich irgendwelche Übersetzungsprobleme von C nach Delphi, die ich aber trotz meiner Suche im Moment nicht erkenne. Sieht das vielleicht jemand auf Anhieb?

Danke für jede Hilfe!


Nachfolgend mein Quellcode, der bei euch auch lauffähig sein sollte, wenn ihr meine Unit "BEMessag" und den Aufruf "InfoMsg" durch was eigenes ersetzt.

Delphi-Quellcode:
program ShowSessions;

(* Testprogramm zur Ermittlung und Auflistung aller Sessions innerhalb der
   Windowsumgebung. *)


uses
  Windows, // Delphi-Bibliothek
  SysUtils, // Delphi-Bibliothek
  BEMessag; // eigene Bibliothek, um "InfoMsg" zur Verfügung zu stellen

type // Notwendige Typdeklarationen für die Windowsroutinen
  TWtsConnectStateClass = (WTSActive, WTSConnected, WTSConnectQuery,
                           WTSShadow, WTSDisconnected, WTSIdle, WTSListen,
                           WTSReset, WTSDown, WTSInit);
  TWtsSessionInfo = packed record
                            SessionId : DWORD;
                            pWinStationName : LPTSTR;
                            State : TWtsConnectStateClass;
                          end;
  pTWtsSessionInfo = ^TWtsSessionInfo;
  TWTSAPI32_WTSEnumerateSessions = function (hServer : THandle;
                                             Reserved : DWORD;
                                             Version : DWORD;
                                             out pSessionInfo : pTWtsSessionInfo;
                                             out Count : DWORD): BOOL;
                                   stdcall;
  TWTSAPI32_WTSFreeMemory = procedure(pMemory : Pointer);
                            stdcall;

const
  CurrentServerHandle = 0; // Handle des aktuellen Servers
  WTSEnumerateSessions : TWTSAPI32_WTSEnumerateSessions = NIL;
  WTSFreeMemory : TWTSAPI32_WTSFreeMemory = NIL;

var
  I, Count : DWord;
  pSessionInfo : pTWtsSessionInfo;
  arrSessionInfo : Array of TWtsSessionInfo;
  Lib : THandle;

//------------------------------------------------------------------------------

begin
  // Bibliotheksroutinen dynamisch im Programm laden
  Lib := LoadLibrary('WTSAPI32.DLL');
  @WTSEnumerateSessions := GetProcaddress(Lib, pChar('WTSEnumerateSessionsA'));
  @WTSFreeMemory := GetProcaddress(Lib, pChar('WTSFreeMemory'));
  // Meldung im Fehlerfall
  if not Assigned(WTSEnumerateSessions) or not Assigned(WTSFreeMemory)
  then InfoMsg(NIL, 'Prozeduren nicht gefunden', 0)
  // Sonst Programm ausführen
  else begin
    // Alle Sessions ermitteln (pSessionInfo zeigt auf das Ergebnis)
    if WTSEnumerateSessions(CurrentServerHandle, 0, 1, pSessionInfo, Count) then
    begin
      // Ergebnis für einfacheren Zugriff in ein dynamisches Array schieben
      SetLength(arrSessionInfo, Count);
      Move(pSessionInfo^, arrSessionInfo[0], Count * SizeOf(TWtsSessionInfo));
      // Anzahl aller Sessions und Namen der einzelnen Sessions anzeigen
      InfoMsg(NIL, 'Anzahl der Sessions: ' + IntToStr(Count), 0);
      for I := 1 to Count do
      begin
        InfoMsg(NIL, 'Session #' + IntToStr(I) + #13#13
                   + 'ID = ' + IntToStr(arrSessionInfo[I-1].SessionID) + #13#13
                   + 'Name = ' + arrSessionInfo[I-1].pWinStationName, 0);
      end;
      // Array wieder freigeben
      SetLength(arrSessionInfo, 0);
    end
    // Meldung im Fehlerfall
    else InfoMsg(NIL, 'Sessions nicht gefunden', 0);
    // Speicher freigeben
    WTSFreeMemory(pSessionInfo);
  end;
end.
  Mit Zitat antworten Zitat