// 以下代码用于windowsNT/2000procedure TraceError; // 报告错误消息 var lpMsgBuf: PChar; var ErrorID: DWORD; begin ErrorID := GetLastError; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, nil, ErrorID, 0, // Default language @lpMsgBuf, 0, nil ); ShowMessage(IntToStr(ErrorID) + ':' + String(lpMsgBuf)); LocalFree(Cardinal(lpMsgBuf)); end;function Prepare(MachineName: PChar): Boolean; // 调整权限 var App: THANDLE; Num: DWORD; Tok: TOKEN_PRIVILEGES; begin Result := False; //ShowMessage('OpenProcessToken...'); if not OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, App ) then TraceError else begin Tok.PrivilegeCount := 1; //ShowMessage('LookupPrivilegeValue...'); if LookupPrivilegeValue(MachineName, 'SeShutdownPrivilege', Tok.Privileges[0].Luid) then begin Tok.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; //ShowMessage('AdjustTokenPrivileges...'); if not AdjustTokenPrivileges(App, False, Tok, SizeOf(Tok), Tok, Num) then TraceError else Result := True; end else TraceError; end; CloseHandle(App); end;function ShutdownWindows: Boolean; // 关机 begin Result := Prepare(nil) and ExitWindowsEx(EWX_SHUTDOWN, 0); end;
EWX_FORCE=4; //关闭所有程序并以其他用户身份登录
EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式
EWX_REBOOT=2; //重新启动计算机
EWX_SHUTDOWN=1;//关闭计算机
var lpMsgBuf: PChar;
var ErrorID: DWORD;
begin
ErrorID := GetLastError;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,
nil,
ErrorID,
0, // Default language
@lpMsgBuf,
0,
nil
);
ShowMessage(IntToStr(ErrorID) + ':' + String(lpMsgBuf));
LocalFree(Cardinal(lpMsgBuf));
end;function Prepare(MachineName: PChar): Boolean; // 调整权限
var
App: THANDLE;
Num: DWORD;
Tok: TOKEN_PRIVILEGES;
begin
Result := False;
//ShowMessage('OpenProcessToken...');
if not OpenProcessToken(
GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
App
) then
TraceError
else
begin
Tok.PrivilegeCount := 1;
//ShowMessage('LookupPrivilegeValue...');
if LookupPrivilegeValue(MachineName, 'SeShutdownPrivilege', Tok.Privileges[0].Luid) then
begin
Tok.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
//ShowMessage('AdjustTokenPrivileges...');
if not AdjustTokenPrivileges(App, False, Tok, SizeOf(Tok), Tok, Num) then
TraceError
else
Result := True;
end
else
TraceError;
end;
CloseHandle(App);
end;function ShutdownWindows: Boolean; // 关机
begin
Result := Prepare(nil) and ExitWindowsEx(EWX_SHUTDOWN, 0);
end;
ExitWindowsEx(EWX_SHUTDOWN,1) //安全关机
ExitWindowsEx(EWX_REBOOT,2) //重新启动计算机
ExitWindowsEx(EWX_FORCE,4) //强行关机
ExitWindowsEx(EWX_POWEROFF,8); //关闭系统并关闭电源