unit WHSystem;
interface
uses
Classes, SysUtils, Windows, mmSystem;
const
//Soft-Variante
Logoff = EWX_LOGOFF or EWX_FORCEIFHUNG;
StandBy = EWX_POWEROFF or EWX_FORCEIFHUNG;
Reboot = EWX_REBOOT or EWX_FORCEIFHUNG;
Shutdown = EWX_SHUTDOWN or EWX_FORCEIFHUNG;
//Harte-Variante
Logoff_F = EWX_LOGOFF or EWX_FORCE;
StandBy_F = EWX_POWEROFF or EWX_FORCE;
Reboot_F = EWX_REBOOT or EWX_FORCE;
Shutdown_F = EWX_SHUTDOWN or EWX_FORCE;
type
ExitWindowsParameter = longword;
function ExitWindows (RebootParam : longword) : boolean;
//zB.: "EWX_REBOOT or EWX_FORCE" zum Neustarten
//Es können auch dierekt die Konstanten aus dieser
Unit verwendet werden!
//Parameter Wirkung
//EWX_LOGOFF Alle Prozesse des Benutzers werden beendet, danach wird der Benutzer abgemeldet.
//EWX_POWEROFF Fährt Windows herunter und setzt den Computer in den StandBy-Modus,
// sofern von der Hardware unterstützt.
//EWX_REBOOT Fährt Windows herunter und startet es neu.
//EWX_SHUTDOWN Fährt Windows herunter.
//EWX_FORCE Die aktiven Prozesse werden zwangsweise und ohne Rückfrage beendet.
//EWX_FORCEIFHUNG Windows 2000/XP: Die aktiven Prozesse werden aufgefordert, sich selbst zu beenden und
// müssen dies bestätigen. Reagieren sie nicht, werden sie zwangsweise beendet.
implementation
function ExitWindows (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;