Power off

=== Power off (Убивает процессы) ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Power off (Убивает процессы)
Зависимости: Windows
Copyright: @
Дата: 21 июня 2002 г.
***************************************************** }
procedure Shutdown2;
var
 hToken: THandle;
 tkp: _TOKEN_PRIVILEGES;
 DUMMY: PTokenPrivileges;
 DummyRL: Cardinal;
begin
 DUMMY := nil;
 if not OpenProcessToken(
 GetCurrentProcess(),
 TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
 hToken
 ) then
 raise TShutdownEx.Create('OpenProcessToken failed');
 if (not LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
 tkp.Privileges[0].Luid)) then
 raise TShutdownEx.Create('LookupPrivilegeValue failed');
 tkp.PrivilegeCount := 1;
 tkp.Privileges[0].Attributes := $0002; //SE_PRIVILEGE_ENABLED = $00002
 AdjustTokenPrivileges(hToken, FALSE, tkp, 0, Dummy, DummyRL);
 if (GetLastError() <> ERROR_SUCCESS) then
 raise TShutdownEx.Create('AdjustTokenPrivileges failed');
 if (not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)) then
 raise TShutdownEx.Create('ExitWindowsEx failed');
end;
Source: http://delphibase.endimus.com
ID: 01688
----
=== Power off (не убивает процессы) ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Power off (не убивает процессы)
Зависимости: Windows
Copyright: @
Дата: 21 июня 2002 г.
***************************************************** }
procedure ExitWinNT(AShutdown: Boolean);
var
 hToken: THandle;
 tkp: TTokenPrivileges;
 ReturnLength, What: Cardinal;
begin
 if AShutdown then
 What := EWX_SHUTDOWN or EWX_POWEROFF
 else
 What := EWX_REBOOT;
 if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
 TOKEN_QUERY, hToken) then
 begin
 LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
 tkp.PrivilegeCount := 1;
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
 ExitWindowsEx(What, 0)
 end
end;
Пример использования: 
ExitWinNT(True); 
Source: http://delphibase.endimus.com
ID: 01689
----
=== procedure RebootSystem() ===
Сегодня мы напишем прогу на WinApi, выключающую W2k, и занимающую всего 10 Кб!
program reboot;
uses
 Windows, messages;
procedure RebootSystem;
var
 handle_: THandle;
 n: DWORD;
 luid: TLargeInteger;
 priv: TOKEN_PRIVILEGES;
 ver: TOSVERSIONINFO;
begin
 ver.dwOSVersionInfoSize := Sizeof(ver);
 GetVersionEx(ver);
 if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then
 begin
 if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, handle_) then
 if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', luid) then
 begin
 priv.PrivilegeCount := 1;
 priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 priv.Privileges[0].Luid := luid;
 AdjustTokenPrivileges(handle_, false, priv, 0, nil, n);
 end
 else
 writeln('Ошибка')
 else
 writeln('Ошибка ');
 end
 else
 writeln('Ошибка ');
 if not ExitWindowsEx(EWX_POWEROFF,1) then
 writeln('Ошибка');
end;
begin
 RebootSystem;
end.
Source: http://delphiworld.narod.ru/
ID: 01690
----
=== procedure NTShutdown ===
procedure NTShutdown;
var
 TokenHandle: Cardinal;
 RetLength: Cardinal;
 TP: TTokenPrivileges;
begin
 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
 if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
 TP.Privileges[0].Luid) then
 begin
 TP.PrivilegeCount := 1;
 TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 RetLength := 0;
 if AdjustTokenPrivileges(TokenHandle, FALSE, TP, 0, nil, RetLength) then
 begin
 if not SetProcessShutdownParameters($4FF, SHUTDOWN_NORETRY) then
 begin
 MessageBox(0, 'Shutdown failed', nil, MB_OK or MB_ICONSTOP);
 end
 else
 begin
 ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);
 end;
 exit;
 end;
 end;
 MessageBox(0, 'Access denied', nil, MB_OK or MB_ICONSTOP);
end;
Source: http://delphiworld.narod.ru/
ID: 01691
----
=== Программно завершить работу компьютера ===
Выключить монитор - это классно, но можно сделать ещё круче - программно завершить работу компьютера. Выглядеть это будет примерно так, с использованием различных режимов выключения: 
==== Завершить работу всех запущенных в системе процессов, сохраняя данные приложения, вызвавшего эту функцию ====
ExitWindowsEx(EWX_LOGOFF or ewx_force, 0);
==== Остановить работу системы в безопасный момент времени. Все буферы очищаются с сохранением данных на диске, все процессы останавливаются ====
ExitWindowsEx(EWX_SHUTDOWN or ewx_force, 0);
==== Перезагрузить систему ====
ExitWindowsEx(EWX_REBOOT or ewx_force, 0);
==== Завершить работу всех запущенных в системе приложений, не посылая им сообщения WM_QUERYENDSESSION и WM_ENDSESSIO. Это может вызвать потерю не сохраненных данных ====
ExitWindowsEx(EWX_FORCE or ewx_force, 0);
==== Завершить работу компьютера с выключением питания, если система поддерживает автоуправление питанием ====
ExitWindowsEx(EWX_POWEROFF or ewx_force, 0);
==== Завершить работу всех запущенных в системе приложений если система висит ====
ExitWindowsEx(EWX_FORCEIFHUNG or ewx_force, 0);
==== Ещё вариант перезагрузки ====
 
mov al,0F0h 
out 64h,al
Source: http://delphiworld.narod.ru/
ID: 01692
----
ExitWindowsEx(EWX_FORCE, 0);
или 
Запуск из коммандной строки 
rundll32 krnl386.exe,exitkernel
только под XP все это работает плохо. Надо думать...
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 01693
----