Hallo,
Hier ist mein nächstes Problem, an dem ich nun schon fast den ganzen Tag experimentiere.
WTSEnumerateSessions liefert bei korrektem Aufruf ein Array (?) of
WTS_SESSION_INFO und die Anzahl der in dem Array (?) enthantenen Elemente zurück.
Delphi-Quellcode:
typedef struct _WTS_SESSION_INFO
{ DWORD SessionId; LPTSTR pWinStationName; WTS_CONNECTSTATE_CLASS State; }
WTS_SESSION_INFO, PWTS_SESSION_INFO;
typedef enum _WTS_CONNECTSTATE_CLASS
{
WTSActive,
WTSConnected,
WTSConnectQuery,
WTSShadow,
WTSDisconnected,
WTSIdle,
WTSListen,
WTSReset,
WTSDown,
WTSInit
} WTS_CONNECTSTATE_CLASS;
BOOL WTSEnumerateSessions(
HANDLE hServer,
DWORD Reserved,
DWORD Version,
PWTS_SESSION_INFO* ppSessionInfo,
DWORD* pCount
);
Nachdem ich
hier ein paar Infos gefunden habe, sieht meine derzeitige Umsetzung wie folgt aus:
Delphi-Quellcode:
type
WTS_CONNECTSTATE_CLASS = LongInt;
const
WTSActive = WTS_CONNECTSTATE_CLASS(1);
WTSConnected = WTS_CONNECTSTATE_CLASS(2);
WTSConnectQuery = WTS_CONNECTSTATE_CLASS(3);
WTSShadow = WTS_CONNECTSTATE_CLASS(4);
WTSDisconnected = WTS_CONNECTSTATE_CLASS(5);
WTSIdle = WTS_CONNECTSTATE_CLASS(6);
WTSListen = WTS_CONNECTSTATE_CLASS(7);
WTSReset = WTS_CONNECTSTATE_CLASS(8);
WTSDown = WTS_CONNECTSTATE_CLASS(9);
WTSInit = WTS_CONNECTSTATE_CLASS(10);
type
_WTS_SESSION_INFO = record
SessionId: DWORD;
pWinStationName: LPTSTR;
State: WTS_CONNECTSTATE_CLASS;
end;
WTS_SESSION_INFO = _WTS_SESSION_INFO;
PWTS_SESSION_INFO = ^_WTS_SESSION_INFO;
type
TWTSAPI32_WTSEnumerateSessions = function(hServer: THandle; Reserved: DWORD; Version: DWORD; ppSessionInfo: pWTS_SESSION_INFO; pCount: pDWORD): BOOL; stdcall;
TWTSAPI32_WTSFreeMemory = procedure(pMemory: Pointer); // zum Freigben des Speichers von pPWTS_SESSION_INFO
Type
TMain = Class(TForm) ...
...
private
// Rückgabewerte von WTSEnumerateSessions
ARR_WTS_SESSION_INFO : ARRAY OF WTS_SESSION_INFO;
pPWTS_SESSION_INFO : Pointer = @ARR_WTS_SESSION_INFO;
WTS_SESSION_COUNT : Integer;
pCount : Pointer = @WTS_SESSION_COUNT;
WTSAPI32_WTSEnumerateSessions: TWTSAPI32_WTSEnumerateSessions;
WTSAPI32_WTSFreeMemory: TWTSAPI32_WTSFreeMemory;
...
...
implementation
...
if NOT WTSAPI32_WTSEnumerateSessions(WTS_Server_Handle, 0, 1, pPWTS_SESSION_INFO, pCount) then
begin
log.Lines.Add('TerminalserverSessions konnten nicht ausgelesen werden');
FreeLibrary(HDL_WTSAPI32_DLL);
HDL_WTSAPI32_DLL := 0;
WTSAPI32_WTSFreeMemory(pPWTS_SESSION_INFO);
exit;
end
else begin
log.Lines.Add(' TerminalserverSessions wurden ermittelt');
WTSAPI32_WTSFreeMemory(pPWTS_SESSION_INFO);
end;
...
Leider ist das Ergebnis von WTSAPI32_WTSEnumerateSessions immer false
Der Aufruf von WTSAPI32_WTSFreeMemory(pPWTS_SESSION_INFO) bringt eine
AV, wahrscheinlich weil der Pointer ins Nirvana zeigt ...
[EDIT]
Ich habe eben noch ein GetLastError eingebaut ...
Unter Win2000 Server (aus einer Terminalsession) bekomme ich als Fehler "Klasse nicht vorhanden" und unter WinXP Pro "Zugriff verweigert".
Das "Zugriff verweigert" kommt sicher daher, das ich unter WinXP keine Möglichkeit finde, das TS Recht "
Query Information" zu setzen ...
[/EDIT]
Ich brauche Hilfe bei der Übersetzung der C Header und Typen ...
Wäre wirklich nett, wenn ihr mir dabei helfen würdet.
Danke und schöne Grüße,
Jens