Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как завершить сеанс работы или перезагрузить Windows NT

Delphi , ОС и Железо , Windows

Как завершить сеанс работы или перезагрузить 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)) then
  begin
    if (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_SHUTDOWN
begin
  Result := True;
  if (SetPrivilege('SeShutdownPrivilege', true)) then
  begin
    if (not ExitWindowsEx(iFlags, 0)) then
    begin
      Result := False;
    end;
    SetPrivilege('SeShutdownPrivilege', False)
  end
  else
  begin
    Result := False;
  end;
end;

Это код на Delphi, который позволяет отключить или перезагрузить Windows NT. Код использует функцию SetPrivilege для предоставления привилегии "SeShutdownPrivilege", которая необходима для выполнения операций отключения или перезапуска.

Расшифровка кода:

  1. Функция SetPrivilege принимает два параметра: aPrivilegeName (имя привилегии, которую нужно настроить) и aEnabled (запретить или разрешить привилегию).
  2. Функция открывает токен процесса с помощью функции OpenProcessToken, а затем adjusts токен'ов привилегий с помощью функции AdjustTokenPrivileges.
  3. Если функция LookupPrivilegeValue возвращает true, это означает, что привилегия существует в системном базе данных. В этом случае функция настраивает атрибуты привилегии на включение или отключение в зависимости от значения aEnabled.
  4. Функция WinExit принимает целочисленный параметр iFlags, который определяет тип операции отключения или перезапуска.
  5. Функция сначала вызывает SetPrivilege для предоставления привилегии "SeShutdownPrivilege", а затем использует функцию ExitWindowsEx для выполнения операции отключения или перезапуска.

Возможные значения параметра iFlags:

  • EWX_LOGOFF: Отключить текущего пользователя без отключения системы.
  • EWX_REBOOT: Перезагрузить систему немедленно.
  • EWX_SHUTDOWN: Отключить систему и выключить электричество.

Альтернативное решение:

Вместо использования функции SetPrivilege можно использовать функцию Windows API OpenSCManager для открытия SCM (Service Control Manager) handle, а затем использовать функцию CreateService для создания сервиса, который выполняет операцию отключения или перезапуска. Это более безопасный подход и не требует предоставления привилегий.

Пример кода:

function WinExit(iFlags: integer): boolean;
var
  hSCMgr: THandle;
begin
  Result := True;
  hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if (hSCMgr <> 0) then
  begin
    CreateService(hSCMgr, 'ShutdownService', '', '', SERVICE_WIN32_OWN_PROCESS,
      SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, nil, nil, 0);
    CloseHandle(hSCMgr);
  end;
end;

Обратите внимание, что это код-снippet предполагает, что у вас есть необходимые разрешения для создания сервиса и выполнения операций отключения или перезапуска.

Рассматривается способ завершения сеанса работы или перезагрузки операционной системы Windows NT, требующий привилегий SeShutdownPrivilege.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:40:40/0.0032470226287842/0