type
TSystemShutdownType = (sstCloseSession, sstPowerOff, sstReboot, sstShutdown);
function SystemShutdown(const ShutdownType: TSystemShutdownType= sstPowerOff): Boolean;
var
TokHandle : THandle;
TokPrivilege: TTokenPrivileges;
ReturnLength, SizeOfTokPrivilege : Cardinal;
begin
Result := OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, TokHandle);
if not result then
exit;
try
SizeOfTokPrivilege := SizeOf(TokPrivilege);
FillChar(TokPrivilege, SizeOfTokPrivilege, 0);
ReturnLength := 0;
TokPrivilege.PrivilegeCount := 1;
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', TokPrivilege.Privileges[0].Luid);
TokPrivilege.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokHandle, False, TokPrivilege, SizeOfTokPrivilege, nil, ReturnLength);
if GetLastError <> ERROR_SUCCESS then
exit;
case ShutDownType of
sstCloseSession : result := ExitWindowsEx(EWX_LOGOFF, 0);
sstPowerOff : result := ExitWindowsEx(EWX_POWEROFF, 0);
sstReboot : result := ExitWindowsEx(EWX_REBOOT, 0);
sstShutdown : result := ExitWindowsEx(EWX_SHUTDOWN, 0);
end;
finally
CloseHandle(TokHandle);
end;
end;