Как выключить, перезагрузить или завершить Windows?

=== Как выключить, перезагрузить или завершить Windows? ===
function MyExitWindows(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;
// Example to shutdown Windows:
procedure TForm1.Button1Click(Sender: TObject);
begin
 MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;
// Example to reboot Windows:
procedure TForm1.Button1Click(Sender: TObject);
begin
 MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;
----
=== 2. Console Shutdown Demo ===
program Shutdown;
{$APPTYPE CONSOLE}
uses 
 SysUtils, 
 Windows; 
// Shutdown Program 
// (c) 2000 NeuralAbyss Software 
// www.neuralabyss.com 
var 
 logoff: Boolean = False; 
 reboot: Boolean = False; 
 warn: Boolean = False; 
 downQuick: Boolean = False; 
 cancelShutdown: Boolean = False; 
 powerOff: Boolean = False; 
 timeDelay: Integer = 0; 
function HasParam(Opt: Char): Boolean; 
var 
 x: Integer; 
begin 
 Result := False; 
 for x := 1 to ParamCount do 
 if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True; 
end; 
function GetErrorstring: string; 
var 
 lz: Cardinal; 
 err: array[0..512] of Char; 
begin 
 lz := GetLastError; 
 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil); 
 Result := string(err); 
end; 
procedure DoShutdown; 
var 
 rl, flgs: Cardinal; 
 hToken: Cardinal; 
 tkp: TOKEN_PRIVILEGES; 
begin 
 flgs := 0; 
 if downQuick then flgs := flgs or EWX_FORCE; 
 if not reboot then flgs := flgs or EWX_SHUTDOWN; 
 if reboot then flgs := flgs or EWX_REBOOT; 
 if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF; 
 if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or 
 EWX_LOGOFF; 
 if Win32Platform = VER_PLATFORM_WIN32_NT then 
 begin 
 if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, 
 hToken) then 
 Writeln('Cannot open process token. [' + GetErrorstring + ']') 
 else 
 begin 
 if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then 
 begin 
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; 
 tkp.PrivilegeCount := 1; 
 AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl); 
 if GetLastError <> ERROR_SUCCESS then 
 Writeln('Error adjusting process privileges.'); 
 end 
 else 
 Writeln('Cannot find privilege value. [' + GetErrorstring + ']'); 
 end; 
 { if CancelShutdown then 
 if AbortSystemShutdown(nil) = False then 
 Writeln(\'Cannot abort. [\' + GetErrorstring + \']\') 
 else 
 Writeln(\'Cancelled.\') 
 else 
 begin 
 if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then 
 Writeln(\'Cannot go down. [\' + GetErrorstring + \']\') 
 else 
 Writeln(\'Shutting down!\'); 
 end; 
 } 
 end; 
 // else begin 
 ExitWindowsEx(flgs, 0); 
 // end; 
end; 
begin 
 Writeln('Shutdown v0.3 for Win32 (similar to the Linux version)'); 
 Writeln('(c) 2000 NeuralAbyss Software. All Rights Reserved.'); 
 if HasParam('?') or (ParamCount = 0) then 
 begin 
 Writeln('Usage: shutdown [-akrhfnc] [-t secs]'); 
 Writeln(' -k: do not really shutdown, only warn.'); 
 Writeln(' -r: reboot after shutdown.'); 
 Writeln(' -h: halt after shutdown.'); 
 Writeln(' -p: power off after shutdown'); 
 Writeln(' -l: log off only'); 
 Writeln(' -n: kill apps that do not want to die.'); 
 Writeln(' -c: cancel a running shutdown.'); 
 end 
 else 
 begin 
 if HasParam('k') then warn := True; 
 if HasParam('r') then reboot := True; 
 if HasParam('h') and reboot then 
 begin 
 Writeln('Error: Cannot specify -r and -h parameters together!'); 
 Exit; 
 end; 
 if HasParam('h') then reboot := False; 
 if HasParam('n') then downQuick := True; 
 if HasParam('c') then cancelShutdown := True; 
 if HasParam('p') then powerOff := True; 
 if HasParam('l') then logoff := True; 
 DoShutdown; 
 end; 
end.
Source: Взято с http://delphiworld.narod.ru
ID: 01670
----
=== функции ExitWindows/ExitWindowsEx ===
Для выполнения перезагрузки/выключения предназначены функции ExitWindows/ExitWindowsEx
==== ExitWindows ====
; Описание
: Function ExitWindows(Reserved: DWord; ReturnCode: Word): Bool;
: Инициирует стандартную процедуру завершения работы с Windows. Все прикладные задачи должны подтвердить завершение работы Windows. Вызывает функцию 4CH прерывания 21H DOS.
; Параметры
* Reserved: Установлен в нуль.
* ReturnCode: Значение, передаваемое в DOS (в регистре AL).
; Возвращаемое значение
: Нуль, если одна или несколько задач отказываются завеpшить работу.
; Примеры использования
 ExitWindows(EWX_LOGOFF,0); - завершение сеанса
 ExitWindows(EWX_SHUTDOWN,0); - выключение компьютера
 ExitWindows(EWX_REBOOT,0); - перезагрузка
 Флаги EWX_FORCE, EWX_POWEROFF и EWX_FORCEIFHUNG могут комбинироваться к нужному действию.
==== ExitWindowsEx ====
Функция ExitWindowsEx() представляет собой расширенный вариант ExitWindows().
; Описание
: BOOL ExitWindowsEx( UINT uFlags, DWORD dwReserved, ); 
: Функция ExitWindowsEx перезагружает(restart) или выключает систему (shutdown), а также может завершить сессию для текущего пользователя(log off). 
; Параметры
* uFlags -- флаг завершения работы, может принимать следущие значения:
** EWX_LOGOFF завершает сессию текущего пользователя.
** EWX_POWEROFF выключает питание компьютера(компьютер должен поддерживать данную функцию).
** EWX_REBOOT перезагружает систему. 
** EWX_SHUTDOWN завершает работу компьютера до того места, где он может быть безопасно выключен: сброшены все файловые буферы на диск, завершает работу всех процессов. 
* dwReserved - Зарезервировано для последующих нужд, параметр игнорируется. 
; Возвращаемое значение
: Не ноль если всё прошло успешно
; Пример использования
: ExitWindowsEx(EWX_SHUTDOWN, 0);
: Остальные примеры смотри в описании первой функции.
Вышеописанные примеры действительны только для w9x/Me.
Дело в том, что, чтобы выполнить функцию в NT ОС, нужно получить права на выполнение этой функции. Сделать это можно через AdjustTokenPriviligies.
С помощью нижеприведённой функции можно получить любую привилегию, в т.ч. и привилегию SeShutdownPrivilege, которая нужна для разрешения функции ExitWindows(Ex)
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;
Пример использования для среды NT:
 SetPrivilege('SeShutdownPrivilege', True);
 ExitWindowsEx(EWX_SHUTDOWN, 0);
Author: Song
Source: Взято из http://forum.sources.ru
ID: 01671