Пример получения имени пользователя и домена под которым работает текущий поток или процесс
Пухнет юзер с голоду,
Губит жизнь он с молоду.
Руки длинные у чата,
Месяц - и кранты, ребята...
// Пример получения имени пользователя и домена под которым работает // текущий поток или процесс 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;
// Получаем маркер доступа текущего потока нашего процессаifnot OpenThreadToken(GetCurrentThread(),TOKEN_QUERY,true,hToken)
thenbeginif GetLastError()< > ERROR_NO_TOKEN then exit;
// В случее ошибки - получаем маркер доступа нашего процесса.ifnot OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,hToken)
then exit;
end;
// Вывываем GetTokenInformation для получения размера буфера ifnot GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf)
thenif GetLastError()< > ERROR_INSUFFICIENT_BUFFER
thenbegin
CloseHandle(hToken);
exit;
end;
if cbBuf = 0 then exit;
// Выделяем память под буфер
GetMem(ptiUser,cbBuf);
// В случае удачного вызова получим указатель на TOKEN_USERif GetTokenInformation(hToken,TokenUser,ptiUser,cbBuf,cbBuf)
thenbegin// Ищем имя пользователя и его домен по его SIDif 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 (лучше проверить на практике)
Программный код на Delphi, демонстрирующий получение имени пользователя и домена текущего процесса или потока. Он использует функции Windows API для достижения этого.
Вот разбивка кода:
Функция GetCurrentUserAndDomain принимает четыре параметра: szUser, chUser, szDomain и chDomain. Они используются для хранения полученных имени пользователя и домена.
Функция сначала пытается открыть токен потока с помощью OpenThreadToken. Если это не удается, она пытается открыть токен процесса с помощью OpenProcessToken.
Затем функция использует GetTokenInformation для получения размера буфера, необходимого для информации о токене. Это хранится в cbBuf.
Функция выделяет память для структуры TOKEN_USER с помощью GetMem, а затем получает информацию о токене в эту структуру.
Затем функция использует LookupAccountSid для преобразования SID пользователя в имя пользователя и домен.
Наконец, функция освобождает любые выделенные ресурсы с помощью CloseHandle и FreeMem.
Пример использования в конце кода демонстрирует, как вызывать эту функцию и получать имя пользователя и домен.
Некоторые примечания:
Функция GetTokenInformation может вернуть ошибку, если буфер слишком маленький. В этом случае функция выходит без получения какой-либо информации.
Функция LookupAccountSid также может вернуть ошибку, если она не может преобразовать SID в имя пользователя и домен. В этом случае функция устанавливает Result в false.
Если вам нужно только получить имя пользователя, можно использовать функцию GetUserName вместо этого кода.
Этот пример можно использовать для определения, является ли процесс системным или запущенным под конкретной учеткой пользователя.
В целом, этот код предоставляет способ программного получения информации о безопасности текущего процесса или потока.
В статье описывается функция GetCurrentUserAndDomain, которая позволяет получить имя пользователя и домен, под которым работает текущий поток или процесс.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.