const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
(Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
function IsAdmin: Boolean;
var
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdministrators: PSID;
x: Integer;
bSuccess: BOOL;
begin
Result := False;
bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
hAccessToken);
ifnot bSuccess thenbeginif GetLastError = ERROR_NO_TOKEN then
bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
hAccessToken);
end;
if bSuccess thenbegin
GetMem(ptgGroups, 1024);
bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
ptgGroups, 1024, dwInfoBufferSize);
CloseHandle(hAccessToken);
if bSuccess thenbegin
AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, psidAdministrators);
{$R-}for x := 0 to ptgGroups.GroupCount - 1 doif EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) thenbegin
Result := True;
Break;
end;
{$R+}
FreeSid(psidAdministrators);
end;
FreeMem(ptgGroups);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
beginif isAdmin then
ShowMessage('Logged in as Administrator');
end;
Here's the translation of the text into Russian:
Код написан на Delphi и проверяет, имеет ли текущий пользователь административные права на системе Windows.
Вот разбивка функции IsAdmin:
Она пытается открыть токен для текущего потока с помощью OpenThreadToken. Если это не удается, она пытается открыть токен для текущего процесса с помощью OpenProcessToken.
Если токен успешно открыт, она выделяет память для переменной PTokenGroups и получает информацию о токене.
Затем она закрывает handle к токену.
Функция создает SID (Security Identifier) для встроенной группы "Administrators" на системе с помощью функции AllocateAndInitializeSid.
Она проходит по группам в токе и проверяет, если есть любая из них, которая соответствует SID, созданной в шаге 4. Если она находит совпадение, она устанавливает переменную Result в значение True.
Наконец, она освобождает память, выделившуюся для SID и переменной PTokenGroups.
Процедура Button1Click прикреплена к кнопке на форме и проверяет, имеет ли пользователь административные права, вызывая функцию IsAdmin. Если результат равен True, она отображает сообщение об ошибке, говорящее "Вошел как Администратор".
Некоторые предложения по улучшению:
Обработка ошибок может быть улучшена. Например, что происходит, если вызов GetLastError неудачен? Код должен обрабатывать такие ошибки правильно.
Выделение и освобождение памяти можно сделать более эффективно с помощью блока try-finally или блока with.
Код использует магические числа (например, $00000020) которые могут быть заменены наименованными константами для лучшей читаемости и поддержки.
Функция IsAdmin может возвращать код ошибки вместо выбрасывания исключения, что позволит вызывающему коду обрабатывать ошибку более легко.
Обратите внимание, что это только пример и может не работать в производственной среде. Код должен быть тщательно протестирован перед использованием в производственной среде.
В статье описывается функция на языке Delphi, которая проверяет, является ли текущий пользователь администратором в системе.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.