|
Utilize a seguinte função:
procedure DesligaWindows(acao:
Cardinal);
var
TokenPriv: TTokenPrivileges;
H: DWORD;
HToken: THandle;
begin
{* para WIN 2000, XP e NT *}
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, HToken);
LookUpPrivilegeValue(nil, 'SeShutdownPrivilege',
TokenPriv.Privileges[0].Luid);
TokenPriv.PrivilegeCount := 1;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
H := 0;
AdjustTokenPrivileges(HToken, False, TokenPriv, 0,PTokenPrivileges(nil)^, H);
CloseHandle(HToken);
end;
ExitWindowsEx(acao, 0);
end;
Chame-a assim, como nestes
exemplos:
DesligaWindows(EWX_SHUTDOWN);
// desligar normal
DesligaWindows(EWX_FORCE); //sair forçado
DesligaWindows(EWX_POWEROFF); //para fontes ATX
DesligaWindwos(EWX_LOGOFF); //efetua logoff
DesligaWindows(EWX_REBOOT); //reinicializa o computador
|