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.