转的 调用:WinExit(EWX_REBOOT or EWX_FORCE);function WinExit(flags: integer): boolean;stdcall;//关闭计算机函数; function SetPrivilege(privilegeName: string; enable: boolean): boolean; var tpPrev, tp : TTokenPrivileges; token : THandle; dwRetLen : DWord; begin result := False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token); tp.PrivilegeCount := 1; if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then begin if enable then tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else tp.Privileges[0].Attributes := 0; dwRetLen := 0; result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen); end; CloseHandle(token); end; begin if SetPrivilege('SeShutdownPrivilege', true) then begin ExitWindowsEx(flags, 0); SetPrivilege('SeShutdownPrivilege', False) end; end;
这里有几个小函数可能用得到: http://www.playicq.com/dispdocnew.php?id=20738{关闭计算机} function WinExit (iFlags: integer) : Boolean; {0:注销 1:关闭计算机 2:重新启动计算机 4:强制注销(不保存状态) 8:关闭电源 16:注销} function SetPrivilege (sPrivilegeName: string; bEnabled: Boolean) : Boolean; var TPPrev,TP: TTokenPrivileges; Token : THandle; dwRetLen : DWORD; begin result := False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token); TP.PrivilegeCount := 1; if LookupPrivilegeValue (nil, PChar (sPrivilegeName), TP.Privileges[0].LUID) then begin if bEnabled then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0; dwRetLen := 0; result := AdjustTokenPrivileges(Token, False, TP, SizeOf (TPPrev), TPPrev,dwRetLen); end; CloseHandle(Token); end;begin Result:=False; if SetPrivilege ('SeShutdownPrivilege', true) then begin if ExitWindowsEx(iFlags, 0) then result:=True; SetPrivilege ('SeShutdownPrivilege', False); end end;
// 参数型及说明: uFlags Long,指定下述一个或多个标志(用OR运算符合并到一起)
// EWX_FORCE 强迫中止没有响应的进程 4
// EWX_LOGOFF 中止进程,然后注销 0
// EWX_SHUTDOWN 关掉系统电源(如果可能的话,ATX电源就可以) 1
// EWX_REBOOT 重新引导系统 2
// EWX_SHUTDOWN 关闭系统 1
// dwReserved Long,保留,设为零
procedure TForm1.Button1Click(Sender: TObject);
var tk:TTokenPrivileges;
hToken: THandle;
h: Dword;begin
tk.PrivilegeCount:=1;
tk.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tk.Privileges[0].luid);
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
AdjustTokenPrivileges(hToken, False, tk, 0, PTokenPrivileges(nil)^, h); ExitWindowsEx(0, 0)
// 参数型及说明: uFlags Long,指定下述一个或多个标志(用OR运算符合并到一起)
// EWX_FORCE 强迫中止没有响应的进程 4
// EWX_LOGOFF 中止进程,然后注销 0
// EWX_SHUTDOWN 关掉系统电源(如果可能的话,ATX电源就可以) 1
// EWX_REBOOT 重新引导系统 2
// EWX_SHUTDOWN 关闭系统 1
// dwReserved Long,保留,设为零 CloseHandle(hToken);
end;
呵呵,借楼上的一点儿光,楼上的,莫要见怪。
嘿嘿.....
调用:WinExit(EWX_REBOOT or EWX_FORCE);function WinExit(flags: integer): boolean;stdcall;//关闭计算机函数;
function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var tpPrev,
tp : TTokenPrivileges;
token : THandle;
dwRetLen : DWord;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
tp.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
begin
if enable then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
end;
CloseHandle(token);
end;
begin
if SetPrivilege('SeShutdownPrivilege', true) then begin
ExitWindowsEx(flags, 0);
SetPrivilege('SeShutdownPrivilege', False)
end;
end;
http://www.playicq.com/dispdocnew.php?id=20738{关闭计算机}
function WinExit (iFlags: integer) : Boolean;
{0:注销
1:关闭计算机
2:重新启动计算机
4:强制注销(不保存状态)
8:关闭电源
16:注销} function SetPrivilege (sPrivilegeName: string; bEnabled: Boolean) : Boolean;
var
TPPrev,TP: TTokenPrivileges;
Token : THandle;
dwRetLen : DWORD;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
TP.PrivilegeCount := 1;
if LookupPrivilegeValue (nil, PChar (sPrivilegeName), TP.Privileges[0].LUID) then
begin
if bEnabled then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else TP.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(Token, False, TP, SizeOf (TPPrev), TPPrev,dwRetLen);
end;
CloseHandle(Token);
end;begin
Result:=False;
if SetPrivilege ('SeShutdownPrivilege', true) then
begin
if ExitWindowsEx(iFlags, 0) then result:=True;
SetPrivilege ('SeShutdownPrivilege', False);
end
end;