Выключение (перезагрузка) Windows

Тема в разделе "Delphi", создана пользователем WinHack, 28 ноя 2016.

  1. WinHack
    На NT-платформах Windows имеются TOKEN PRIVILEGES, где имеется способ завершения работы Windows ("SeShutDownPrivilege"). Это причина, почему Вы не можете завершать или перезагружать Win2K кодом EWX_SHUTDOWN, когда эта привилегия не допускается. Есть короткий отрывок завершения работы Win2K.

    Допустим, Вам нужно узнать, на основе какой платформы идет управление кодом, используя функцию GetWindows для получения версии:


    Код:
    function WindowsExit(RebootParam: Longword): Boolean;
    var
       TTokenHd: THandle;
       TTokenPvg: TTokenPrivileges;
       cbtpPrevious: DWORD;
       rTTokenPvg: TTokenPrivileges;
       pcbtpPreviousRequired: DWORD;
       tpResult: Boolean;
    const
       SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    begin
       if Win32Platform = VER_PLATFORM_WIN32_NT then
       begin
         tpResult := OpenProcessToken(GetCurrentProcess(),
           TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
           TTokenHd) ;
         if tpResult then
         begin
           tpResult := LookupPrivilegeValue(nil,
                                            SE_SHUTDOWN_NAME,
                                            TTokenPvg.Privileges[0].Luid) ;
           TTokenPvg.PrivilegeCount := 1;
           TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
           cbtpPrevious := SizeOf(rTTokenPvg) ;
           pcbtpPreviousRequired := 0;
           if tpResult then
             Windows.AdjustTokenPrivileges(TTokenHd,
                                           False,
                                           TTokenPvg,
                                           cbtpPrevious,
                                           rTTokenPvg,
                                           pcbtpPreviousRequired) ;
         end;
       end;
       Result := ExitWindowsEx(RebootParam, 0) ;
    end;

    Использоание:

    Код:
    // Завершение работы Windows
    WindowsExit(EWX_POWEROFF or EWX_FORCE) ;
    
    // Перезагрузка Windows
    WindowsExit(EWX_REBOOT or EWX_FORCE) ;