Получение имени пользователя и домена

Материал из DRKB


// Пример получения имени пользователя и домена под которым работает
// текущий поток или процесс
type
  PTOKEN_USER = ^TOKEN_USER;
  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;
  TOKEN_USER = _TOKEN_USER;

function GetCurrentUserAndDomain(szUser: PChar; var chUser: DWORD;
  szDomain: PChar; var chDomain: DWORD): Boolean;
var
  hToken: THandle;
  cbBuf: Cardinal;
  ptiUser: PTOKEN_USER;
  snu: SID_NAME_USE;
begin
  Result := False;
  // Получаем маркер доступа текущего потока нашего процесса
  if not OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, True, hToken) then
  begin
    if GetLastError() <> ERROR_NO_TOKEN then exit;
    // В случае ошибки - получаем маркер доступа нашего процесса.
    if not OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken) then exit;
  end;

  // Вызываем GetTokenInformation для получения размера буфера
  if not GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf) then
    if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then
    begin
      CloseHandle(hToken);
      exit;
    end;

  if cbBuf = 0 then exit;

  // Выделяем память под буфер
  GetMem(ptiUser, cbBuf);

  // В случае удачного вызова получим указатель на TOKEN_USER
  if GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf) then
  begin
    // Ищем имя пользователя и его домен по его SID
    if LookupAccountSid(nil, ptiUser.User.Sid, szUser, chUser, szDomain, chDomain, snu) then
      Result := True;
  end;

  // Освобождаем ресурсы
  CloseHandle(hToken);
  FreeMem(ptiUser);
end;

// Использовать функцию можно так :
var
  Domain, User: array [0..50] of Char;
  chDomain, chUser: Cardinal;
begin
  chDomain := 50;
  chUser :=50;
  if GetCurrentUserAndDomain(User, chuser, Domain, chDomain) then
    //...
end;

// Если вам необходимо получить только имя пользователя - используйте GetUserName
// Данный пример можно использовать и для определения - запущен ли процесс
// системой или пользователем.  Учетной записи Localsystem соответствует
// имя пользователя - SYSTEM и домен NT AUTORITY (лучше проверить на практике)


Source: http://delphiworld.narod.ru
ID: 03313