Получение пользователя и домена под которым работает текущий процесс

Материал из 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: 01734