program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows;
type
_WTS_INFO_CLASS = DWORD;
// _WTS_INFO_CLASS <--- muss vier Byte groß sein (also DWORD), kleiner mit Word (SizeOf == 2) oder
// Byte (SizeOf == 1) wie die meisten Delphi-Enums geht schief.
const
WTSInitialProgram: _WTS_INFO_CLASS = 0;
WTSApplicationName: _WTS_INFO_CLASS = 1;
WTSWorkingDirectory: _WTS_INFO_CLASS = 2;
WTSOEMId: _WTS_INFO_CLASS = 3;
WTSSessionId: _WTS_INFO_CLASS = 4;
WTSUserName: _WTS_INFO_CLASS = 5;
WTSWinStationName: _WTS_INFO_CLASS = 6;
WTSDomainName: _WTS_INFO_CLASS = 7;
WTSConnectState: _WTS_INFO_CLASS = 8;
WTSClientBuildNumber: _WTS_INFO_CLASS = 9;
WTSClientName: _WTS_INFO_CLASS = 10;
type
TWTSQuerySessionInformationA =
function(hServer: THandle; SessionId: DWORD; WTSInfoClass: _WTS_INFO_CLASS;
var ppBuffer: Pointer;
var pBytesReturned: DWORD): BOOL;
stdcall;
const
WTS_CURRENT_SESSION = DWORD(-1);
WTS_CURRENT_SERVER_HANDLE = 0;
function TestWTS: BOOL;
var
ppBuffer: Pointer;
pBytesReturned: DWORD;
_TWTSQuerySessionInformationA: TWTSQuerySessionInformationA;
begin
_TWTSQuerySessionInformationA := GetProcAddress(LoadLibraryA(PAnsiChar('
wtsapi32.dll')), PAnsiChar('
WTSQuerySessionInformationA'));
Result := TWTSQuerySessionInformationA(_TWTSQuerySessionInformationA)(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientName,
ppBuffer, pBytesReturned);
try
if Result
then
begin
Writeln('
Call to WTSQuerySessionInformation was successful');
end else
RaiseLastOSError;
except
end;
end;
begin
try
TestWTS;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
Readln;
end.