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

Previous  Top  Next

    
 

 

Code:

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

// текущий поток или процесс

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 (лучше проверить на практике)

 

 

©Drkb::01734

http://delphiworld.narod.ru/

DelphiWorld 6.0