Как завершить сеанс работы или перезагрузить Windows NT
Для этого нам потребуются определённые привелегии:
function SetPrivilege(aPrivilegeName: string;
aEnabled: boolean): boolean;
var
TPPrev,
TP: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, @Token);
TP.PrivilegeCount := 1;
if (LookupPrivilegeValue(nil, PChar(aPrivilegeName),
TP.Privileges[0].LUID)) thenbeginif (aEnabled) then
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token, False, TP,
SizeOf(TPPrev),
TPPrev, dwRetLen);
end;
CloseHandle(Token);
end;
function WinExit(iFlags: integer): boolean;
// возможные флаги:// EWX_LOGOFF// EWX_REBOOT// EWX_SHUTDOWNbegin
Result := True;
if (SetPrivilege('SeShutdownPrivilege', true)) thenbeginif (not ExitWindowsEx(iFlags, 0)) thenbegin
Result := False;
end;
SetPrivilege('SeShutdownPrivilege', False)
endelsebegin
Result := False;
end;
end;
Это код на Delphi, который позволяет отключить или перезагрузить Windows NT. Код использует функцию SetPrivilege для предоставления привилегии "SeShutdownPrivilege", которая необходима для выполнения операций отключения или перезапуска.
Расшифровка кода:
Функция SetPrivilege принимает два параметра: aPrivilegeName (имя привилегии, которую нужно настроить) и aEnabled (запретить или разрешить привилегию).
Функция открывает токен процесса с помощью функции OpenProcessToken, а затем adjusts токен'ов привилегий с помощью функции AdjustTokenPrivileges.
Если функция LookupPrivilegeValue возвращает true, это означает, что привилегия существует в системном базе данных. В этом случае функция настраивает атрибуты привилегии на включение или отключение в зависимости от значения aEnabled.
Функция WinExit принимает целочисленный параметр iFlags, который определяет тип операции отключения или перезапуска.
Функция сначала вызывает SetPrivilege для предоставления привилегии "SeShutdownPrivilege", а затем использует функцию ExitWindowsEx для выполнения операции отключения или перезапуска.
Возможные значения параметра iFlags:
EWX_LOGOFF: Отключить текущего пользователя без отключения системы.
EWX_REBOOT: Перезагрузить систему немедленно.
EWX_SHUTDOWN: Отключить систему и выключить электричество.
Альтернативное решение:
Вместо использования функции SetPrivilege можно использовать функцию Windows API OpenSCManager для открытия SCM (Service Control Manager) handle, а затем использовать функцию CreateService для создания сервиса, который выполняет операцию отключения или перезапуска. Это более безопасный подход и не требует предоставления привилегий.
Обратите внимание, что это код-снippet предполагает, что у вас есть необходимые разрешения для создания сервиса и выполнения операций отключения или перезапуска.
Рассматривается способ завершения сеанса работы или перезагрузки операционной системы Windows NT, требующий привилегий SeShutdownPrivilege.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.