var
VerInfo:TOSVersionInfo;
hToken:THANDLE;
tkp:TOKEN_PRIVILEGES;
Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
Begin
  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
  LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
  tkp.PrivilegeCount:= 1;
  tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
  End;
  ExitWindowsEx(//Your option here,see msdn or win32help);
end;

解决方案 »

  1.   

    在使用ExitWindowsEx函数的时候注意要有关机的权限。
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
             VerInfo:TOSVersionInfo;
             hToken:THANDLE;
             tkp:TOKEN_PRIVILEGES;
             Nothing:Cardinal;
    begin
            VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
            GetVersionEx(VerInfo);
            if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
            Begin
              OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
              LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
              tkp.PrivilegeCount:= 1;
              tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
              AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
            End;
            ExitWindowsEx(EWX_REBOOT,0);// ExitWindowsEx(EWX_SHUTDOWN,0);
    end;