![]() |
Windows Sessions ermitteln mit WTSEnumerateSessions
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. |
AW: Windows Sessions ermitteln mit WTSEnumerateSessions
Delphi-Quellcode:
ist (aus Erfahrung) im Zusammenhang mit der WinAPI (oder anderen API's) immer falsch.
Packed
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 ![]() 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; |
AW: Windows Sessions ermitteln mit WTSEnumerateSessions
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! :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz