Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#9

Re: Datenaustausch (Message o.Ä.) von Terminalserver an Clie

  Alt 21. Sep 2005, 20:26
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
  Mit Zitat antworten Zitat