{ 注销:MyExitWindows(EWX_LogOff); 重启:MyExitWindows(EWX_REBOOT); 关机:MyExitWindows(EWX_SHUTDOWN); } function SetShutdownPrivilege(Enable: Boolean): Boolean; var PrevPrivileges: TTokenPrivileges; Privileges: TTokenPrivileges; Token: THandle; dwRetLen: DWord; begin Result := False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token); Privileges.PrivilegeCount := 1; if LookupPrivilegeValue(nil,'SeShutdownPrivilege', Privileges.Privileges[0].LUID) then begin if Enable then Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else Privileges.Privileges[0].Attributes := 0; dwRetLen := 0; Result := AdjustTokenPrivileges(Token, False, Privileges, SizeOf(PrevPrivileges), PrevPrivileges, dwRetLen); end; CloseHandle(Token); end;procedure MyExitWindows(const P:Word); begin Application.Terminate; if IsWin9x then ExitWindowsEx(EWX_FORCE or P, 0) else begin SetShutdownPrivilege(True); ExitWindowsEx(EWX_FORCE or P, 0); SetShutdownPrivilege(False); end; end;
function ShutdownPC(Action : Integer) : boolean; const ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES; SHTDWN_PRIV = 'SeShutdownPrivilege'; PRIV_SIZE = sizeOf(TTokenPrivileges); var uFlags: Cardinal; Len: DWORD; TokenPriv, Dummy: TTokenPrivileges; Token: THandle; Error: integer; begin error := 0; if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then Error := Error or 4; if not LookupPrivilegeValue(nil, SHTDWN_PRIV, TokenPriv.Privileges[0].Luid) then Error := Error or 8; TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; TokenPriv.PrivilegeCount := 1; // One privilege to set if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE, Dummy, Len) then Error := Error or 16; case Action of 0: uFlags := EWX_POWEROFF + EWX_SHUTDOWN; //提示关机 1: uFlags := EWX_POWEROFF + EWX_FORCE; //强制关机 2: uFlags := EWX_ReBoot; //提示重启系统 3: uFlags := EWX_ReBoot + EWX_FORCE; //强制重启系统 end; if Application.MessageBox(PChar('您是否要执行 ''' + inttostr(cbAction.ItemIndex) +':'+ cbAction.Text +''' 操作?'),PChar('提示'),MB_YESNO + MB_ICONQUESTION) = IDYES then ExitWindowsEx(uFlags, 0); Result := (Error = 0); end;
注销:MyExitWindows(EWX_LogOff);
重启:MyExitWindows(EWX_REBOOT);
关机:MyExitWindows(EWX_SHUTDOWN);
}
function SetShutdownPrivilege(Enable: Boolean): Boolean;
var
PrevPrivileges: TTokenPrivileges;
Privileges: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
Privileges.PrivilegeCount := 1;
if LookupPrivilegeValue(nil,'SeShutdownPrivilege', Privileges.Privileges[0].LUID) then
begin
if Enable then
Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
Privileges.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token, False, Privileges, SizeOf(PrevPrivileges), PrevPrivileges, dwRetLen);
end;
CloseHandle(Token);
end;procedure MyExitWindows(const P:Word);
begin
Application.Terminate;
if IsWin9x then
ExitWindowsEx(EWX_FORCE or P, 0)
else
begin
SetShutdownPrivilege(True);
ExitWindowsEx(EWX_FORCE or P, 0);
SetShutdownPrivilege(False);
end;
end;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);
var
uFlags: Cardinal;
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Error: integer;
begin
error := 0;
if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
Error := Error or 4;
if not LookupPrivilegeValue(nil, SHTDWN_PRIV, TokenPriv.Privileges[0].Luid) then
Error := Error or 8;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1; // One privilege to set
if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE, Dummy, Len) then
Error := Error or 16;
case Action of
0: uFlags := EWX_POWEROFF + EWX_SHUTDOWN; //提示关机
1: uFlags := EWX_POWEROFF + EWX_FORCE; //强制关机
2: uFlags := EWX_ReBoot; //提示重启系统
3: uFlags := EWX_ReBoot + EWX_FORCE; //强制重启系统
end;
if Application.MessageBox(PChar('您是否要执行 ''' + inttostr(cbAction.ItemIndex) +':'+ cbAction.Text +''' 操作?'),PChar('提示'),MB_YESNO + MB_ICONQUESTION) = IDYES then
ExitWindowsEx(uFlags, 0);
Result := (Error = 0);
end;