Delphi 获取Windows系统会话用户名

Function GetLogUser(Var dwCount :DWORD):PLPChar;
Var
  szLogName     :PAnsiChar;
  dwSize        :DWORD;
  I             :DWORD;
  SessionsInfo  :PWTS_SESSION_INFOA;
  SessionsSeek  :PWTS_SESSION_INFOA;
  SessionsCount :DWORD;

  szBuffer      :Array [0..MAXCHAR * 64] of AnsiChar;
  lpszSeek      :PAnsiChar;
begin
  Result    := Nil;
  dwCount   := 0;
  if WTSEnumerateSessionsA(WTS_CURRENT_SERVER_HANDLE, 0, 1, SessionsInfo, SessionsCount) then
  begin
    ZeroMemory(@szBuffer, SizeOf(szBuffer));
    lpszSeek := PAnsiChar(@szBuffer);
    SessionsSeek := SessionsInfo;
    For I:= 0 To SessionsCount - 1 do
    begin
      if (SessionsSeek.State = WTSActive) or (SessionsSeek.State = WTSDisconnected) then
      begin
        szLogName := Nil;
        dwSize    := 0;
        if WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, SessionsSeek.SessionId, WTSUserName, szLogName, dwSize) And (szLogName[0] <> #0) then
        begin
          Inc(dwCount);
          lstrcpyA(lpszSeek, szLogName);
          Inc(lpszSeek, lstrlenA(lpszSeek) + 1);
          WTSFreeMemory(szLogName);
        end;
      end;
      Inc(SessionsSeek);
    end;
    WTSFreeMemory(SessionsInfo);
  end;
  if (dwCount > 0) And (szBuffer[0] <> #0) then
  begin
    Result := GetMemory(SizeOf(PAnsiChar) * (dwCount + 2));
    if (Result <> Nil) And CheckMemory(Result, SizeOf(PAnsiChar) * (dwCount + 2)) then
    begin
      lpszSeek := PAnsiChar(@szBuffer);
      for I := 0 to dwCount-1 do
      begin
        dwSize  := lstrlenA(lpszSeek);
        Result[I] := GetMemory(dwSize + 1);
        if (Result[I] <> Nil) And CheckMemory(Result[I], dwSize + 1) then
        begin
          lstrcpynA(Result[I], lpszSeek, dwSize + 1)
        end;
        Inc(lpszSeek, dwSize + 1);
      end;
    end;
  end;
end;


标签: windows, delphi, 用户名, Sessions, loguser

仅有一条评论

  1. 阿狸派 阿狸派

    谢谢,好文章,非常喜欢。

添加新评论