AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Windows Sessions ermitteln mit WTSEnumerateSessions
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Sessions ermitteln mit WTSEnumerateSessions

Ein Thema von daddy · begonnen am 10. Nov 2011 · letzter Beitrag vom 10. Nov 2011
Antwort Antwort
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
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Windows Sessions ermitteln mit WTSEnumerateSessions

  Alt 10. Nov 2011, 15:14
Packed ist (aus Erfahrung) im Zusammenhang mit der WinAPI (oder anderen API's) immer falsch.

Außerdem würde ich mir an deiner Stelle nicht so viel Mühe machen. Es gibt doch z.B. die Jedi-WinAPI. Die kannst du z.B. von hier per svn auschecken und hast damit alle Funktionen da.

Damit funktioniert auch dieser Code:
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
  info : pWtsSessionInfo;
  cnt,
  idx : Cardinal;
begin
  if WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, info, cnt) then
  begin
    for idx := 0 to cnt - 1 do
    begin
      Memo1.Lines.Add(IntToStr(info^.SessionId) + ' - ' + info^.pWinStationName);
      Inc(info);
    end;

    WTSFreeMemory(info);
  end;
end;
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
daddy

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

AW: Windows Sessions ermitteln mit WTSEnumerateSessions

  Alt 10. Nov 2011, 15:43
Na danke für den Hinweis. Es lag tatsächlich an dem "packed". Das hatte ich aus einem älteren Beitrag hier in der DP heraus kopiert und gar nicht mehr weiter beachtet.

Jetz seh ich mal weiter, ob ich das was ich benötige selber programmiere oder mich mit den Jedi-Files mal näher beschäftige.

Jedenfalls VIELEN DANK!
  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 08:12 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