Как проверить, имеем ли мы административные привилегии в системе
Интернетчика спросили:
- Что такое "Червона Рута"?
- Это женщина-админ на сервере Компартии.
type
PTOKEN_GROUPS = TOKEN_GROUPS^;
function RunningAsAdministrator (): Boolean;
var
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
psidAdmin: PSID;
ptg: PTOKEN_GROUPS = nil;
htkThread: Integer; { HANDLE }
cbTokenGroups: Longint; { DWORD }
iGroup: Longint; { DWORD }
bAdmin: Boolean;
begin
Result := false;
ifnot OpenThreadToken(GetCurrentThread(), // get security token
TOKEN_QUERY, FALSE, htkThread) thenif GetLastError() = ERROR_NO_TOKEN thenbeginifnot OpenProcessToken(GetCurrentProcess(),
TOKEN_QUERY, htkThread) then
Exit;
endelse
Exit;
if GetTokenInformation(htkThread, // get #of groups
TokenGroups, nil, 0, cbTokenGroups) then
Exit;
if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then
Exit;
ptg := PTOKEN_GROUPS( getmem( cbTokenGroups ) );
ifnot Assigned(ptg) then
Exit;
ifnot GetTokenInformation(htkThread, // get groups
TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then
Exit;
ifnot AllocateAndInitializeSid(SystemSidAuthority,
2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, psidAdmin) then
Exit;
iGroup := 0;
while iGroup < ptg^.GroupCount do// check administrator groupbeginif EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) thenbegin
Result := TRUE;
break;
end;
Inc( iGroup );
end;
FreeSid(psidAdmin);
end;
Код, который я предоставил, - это функция Delphi под именем RunningAsAdministrator, которая проверяет, имеет ли текущий процесс или поток административные привилегии на Windows.
Вот шаг за шагом, как она работает:
Функция сначала пытается открыть токен безопасности, связанный с текущим потоком, используя OpenThreadToken. Если это не удается, она переходит к открытию токена безопасности, связанного с текущим процессом, используя OpenProcessToken.
Затем она получает количество групп, связанных с токеном, используя GetTokenInformation, и выделяет память для структуры PTOKEN_ GROUPS.
Функция затем получает фактическую информацию о группах, используя GetTokenInformation снова, на этот раз заполняющую структуру PTOKEN_ GROUPS.
Она выделяет и инициализирует SID (Security Identifier), представляющий встроенную группу "Administrators" с помощью AllocateAndInitializeSid.
Функция затем проходит через группы, связанные с токеном, проверяя, если какие-либо из них совпадают с SID-группой "Administrators", используя EqualSid. Если она находит совпадение, она устанавливает результат в True и выходит.
Наконец, функция освобождает выделенную память SID с помощью FreeSid.
Возвращаемое значение этой функции - булево значение, указывающее, имеет ли текущий процесс или поток административные привилегии.
Вы можете использовать эту функцию в своем коде Delphi следующим образом:
ifRunningAsAdministratorthenShowMessage('Мы имеем административные привилегии!');elseShowMessage('Мы не имеем административных привилегий.');
Обратите внимание, что эта функция проверяет только административные привилегии на локальном компьютере и не проверяет доменные привилегии. Кроме того, это код quite low-level и может требовать осторожного обращения для предотвращения потенциальных проблем, таких как утечки памяти или ошибки.
Данная статья описывает функцию RunningAsAdministrator для проверки административных привилегий в системе, используя API Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.