定义一个过程: procedure ExitWindowsNT(uFlags : integer); var hToken : THANDLE; tkp, tkDumb : TTokenPrivileges; DumbInt : integer; begin FillChar(tkp, sizeof(tkp), 0); // Get a token for this process if not (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)) then raise Exception.create('OpenProcessToken failed with code ' + inttostr(GetLastError)); // Get the LUID for the Shutdown privilege LookupPrivilegeValue(nil, pchar('SeShutdownPrivilege'), tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; // one privilege to set tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // Get the shutdown provolege for this process AdjustTokenPrivileges(hToken, false, tkp, sizeof(tkDumb), tkDumb, DumbInt); // Cannot test the return value of AdjustTokenPrivileges if GetLastError <> ERROR_SUCCESS then Raise Exception.create('AdjustTokenPrivileges failed with code ' + inttostr(GetLastError)); // shut down the system and for all applications to close if not ExitWindowsEx(uFlags, 0) then Raise Exception.create('ExitWindowsEx failed with code ' + inttostr(GetLastError)); end;调用过程: ExitWindowsNT(EWX_SHUTDOWN or EWX_FORCE)或 ExitWindowsNT(EWX_REBOOT)即可。
procedure ExitWindowsNT(uFlags : integer);
var
hToken : THANDLE;
tkp, tkDumb : TTokenPrivileges;
DumbInt : integer;
begin
FillChar(tkp, sizeof(tkp), 0);
// Get a token for this process
if not (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken)) then
raise Exception.create('OpenProcessToken failed with code '
+ inttostr(GetLastError)); // Get the LUID for the Shutdown privilege
LookupPrivilegeValue(nil, pchar('SeShutdownPrivilege'),
tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; // one privilege to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // Get the shutdown provolege for this process
AdjustTokenPrivileges(hToken, false, tkp, sizeof(tkDumb), tkDumb, DumbInt); // Cannot test the return value of AdjustTokenPrivileges
if GetLastError <> ERROR_SUCCESS then
Raise Exception.create('AdjustTokenPrivileges failed with code '
+ inttostr(GetLastError)); // shut down the system and for all applications to close
if not ExitWindowsEx(uFlags, 0) then
Raise Exception.create('ExitWindowsEx failed with code '
+ inttostr(GetLastError));
end;调用过程:
ExitWindowsNT(EWX_SHUTDOWN or EWX_FORCE)或
ExitWindowsNT(EWX_REBOOT)即可。