program Project1;
{$APPTYPE CONSOLE}
{$MODE OBJFPC}
{$LONGSTRINGS ON}
{$MINENUMSIZE 4}
uses Windows, SysUtils;
const
SERVERNAME_CURRENT = 0;
LOGONID_CURRENT = ULONG(-1);
WINSTATIONNAME_LENGTH = 32;
DOMAIN_LENGTH = 17;
USERNAME_LENGTH = 20;
WinStationInformation = 8;
type
TWinStationStateClass = (State_Active, State_Connected, State_ConnectQuery,
State_Shadow, State_Disconnected, State_Idle, State_Listen, State_Reset,
State_Down, State_Init);
TWinStationName = array[0..WINSTATIONNAME_LENGTH] of WideChar;
TProtocolCounters = record
WdBytes: ULONG;
WdFrames: ULONG;
WaitForOutBuf: ULONG;
Frames: ULONG;
Bytes: ULONG;
CompressedBytes: ULONG;
CompressFlushes: ULONG;
Errors: ULONG;
Timeouts: ULONG;
AsyncFramingError: ULONG;
AsyncOverrunError: ULONG;
AsyncOverflowError: ULONG;
AsyncParityError: ULONG;
TdErrors: ULONG;
ProtocolType: USHORT;
Length: USHORT;
Reserved: array[0..99] of ULONG;
end;
TCacheStatistics = record
ProtocolType: USHORT;
Length: USHORT;
Reserved: array[0..19] of ULONG;
end;
TProtocolStatus = record
Output: TProtocolCounters;
Input: TProtocolCounters;
Cache: TCacheStatistics;
AsyncSignal: ULONG;
AsyncSignalMask: ULONG;
end;
TWinStationInformation = record
ConnectState: TWinStationStateClass;
WinStationName: TWinStationName;
LogonId: ULONG;
ConnectTime: TFileTime;
DisconnectTime: TFileTime;
LastInputTime: TFileTime;
LogonTime: TFileTime;
Status: TProtocolStatus;
Domain: array[0..DOMAIN_LENGTH] of WideChar;
UserName: array[0..USERNAME_LENGTH] of WideChar;
CurrentTime: TFileTime;
end;
// Wrapper for RpcWinStationQueryInformation
function WinStationQueryInformationW(hServer: THandle; SessionId: DWORD;
WinStationInformationClass: Cardinal; pWinStationInformation: PVOID;
WinStationInformationLength: DWORD; out pReturnLength: DWORD): BOOL;
stdcall; external 'winsta.dll';
function FileTimeToStr(const R: TFileTime): string;
var
LocTime: TFileTime;
SysTime: TSystemTime;
begin
if FileTimeToLocalFileTime(@R, @LocTime) and FileTimeToSystemTime(@R, @SysTime) then
Result := DateTimeToStr(SystemTimeToDateTime(SysTime))
else
Result := '';
end;
var
R: TWinStationInformation;
Len: DWORD;
begin
if WinStationQueryInformationW(SERVERNAME_CURRENT, LOGONID_CURRENT,
WinStationInformation, @R, SizeOf(R), Len) then
begin
Writeln('Domain\UserName: ', UnicodeString(R.Domain), '\', UnicodeString(R.UserName));
Writeln('LogonTime: ', FileTimeToStr(R.LogonTime));
Writeln('CurrentTime: ', FileTimeToStr(R.CurrentTime));
Readln;
end;
end.