нужно получить список активных сессий из Windws

yemets63
Дата: 25.11.2019 10:22:20
на прошлой неделе начинал писать, но в разделе Windows, попробовал не получилось, Гугль потыкал, информации полно, но полезного не нашел.


я получаю список локальных активных СЕССИЙ пользователей командой windows QWINSTA, работает, но не удобно и не достаточно доверия.
поэтому вопрос, как в Delphi получить список активных СЕССИЙ пользователей Windox XP - Windows 10 самим Delphi

в WinAPI посмотрел, он дает только список пользователей, а как определить активна сессия или нет???
Barmaley57
Дата: 25.11.2019 11:36:42
type
  WTS_INFO_CLASS = (
    WTSInitialProgram,
    WTSApplicationName,
    WTSWorkingDirectory,
    WTSOEMId,
    WTSSessionId,
    WTSUserName,
    WTSWinStationName,
    WTSDomainName,
    WTSConnectState,
    WTSClientBuildNumber,
    WTSClientName,
    WTSClientDirectory,
    WTSClientProductId,
    WTSClientHardwareId,
    WTSClientAddress,
    WTSClientDisplay,
    WTSClientProtocolType,
    WTSIdleTime,
    WTSLogonTime,
    WTSIncomingBytes,
    WTSOutgoingBytes,
    WTSIncomingFrames,
    WTSOutgoingFrames,
    WTSClientInfo,
    WTSSessionInfo,
    WTSSessionInfoEx,
    WTSConfigInfo,
    WTSValidationInfo,
    WTSSessionAddressV4,
    WTSIsRemoteSession
  );

  WTS_CONNECTSTATE_CLASS = (
    WTSActive,
    WTSConnected,
    WTSConnectQuery,
    WTSShadow,
    WTSDisconnected,
    WTSIdle,
    WTSListen,
    WTSReset,
    WTSDown,
    WTSInit
  );

  PWTS_SESSION_INFO = ^WTS_SESSION_INFO;
  WTS_SESSION_INFO = record
    SessionId: DWORD;
    pWinStationName: LPTSTR;
    State: WTS_CONNECTSTATE_CLASS;
  end;


function WTSOpenServer(pServerName:PChar):THandle;stdcall; external 'Wtsapi32.dll' name 'WTSOpenServerW';

function WTSEnumerateSessions(hServer: THandle; Reserved: DWORD; Version: DWORD; var ppSessionInfo: PWTS_SESSION_INFO; var pCount: DWORD): BOOL; stdcall; external 'Wtsapi32.dll' name 'WTSEnumerateSessionsW';

function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD; WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: LPTSTR; var pBytesReturned: DWORD): BOOL; stdcall; external 'Wtsapi32.dll' name 'WTSQuerySessionInformationW';

procedure WTSFreeMemory(pMemory: Pointer); stdcall; external 'Wtsapi32.dll';

var
  Server:THandle;
  Sessions, Session: PWTS_SESSION_INFO;
  NumSessions, I, NumBytes: DWORD;
  UserName: LPTSTR;
begin
  Server:=WTSOpenServer('192.168.1.5');

  if not WTSEnumerateSessions(Server, 0, 1, Sessions, NumSessions) then
    RaiseLastOSError;
  try
    if NumSessions > 0 then
    begin
      Session := Sessions;
      for I := 0 to NumSessions-1 do
      begin
        if Session.State = WTSActive then
        begin
          if WTSQuerySessionInformation(Server, Session.SessionId, WTSUserName, UserName, NumBytes) then
          begin
            try
              // здесь используем Session.pWinStationName;
            finally
              WTSFreeMemory(UserName);
            end;
          end;
        end;
        Inc(Session);
      end;
    end;
  finally
    WTSFreeMemory(Sessions);
  end;
end;
makhaon
Дата: 25.11.2019 11:37:30
yemets63,

WTSEnumerateSessions посмотри