你仔细看
 ExitWindowsEx的帮助了吗?http://www.csdn.net/Expert/forum.asp?typenum=8&searchKeys=ExitWindowsEx&roomid=3&author=&tabletype=now

解决方案 »

  1.   

    为什么不直接用
    ExitWindowsEx(
        UINT uFlags,
        DWORD dwReserved
       );
    uFlags
      EWX_FORCE
      EWX_LOGOFF
      EWX_POWEROFF
      EWX_REBOOT
      EWX_SHUTDOWN
      

  2.   

    另外要注意一点
    在NT/2000你的进程必须有足够的优先权否则不执行这种操作
    win9x无优先权限制
      

  3.   

    在2000中
    要先用AdjustTokenPrivileges设置权限
    function SetPrivilege(sPrivilegeName:string;bEnabled:boolean):boolean;
    var
      TP,TPPre:TTokenPrivileges;
      Token:THandle;
      dwLength:DWORD;
    begin
      result := false;
      OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token);
      try
      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;
        dwLength := 0;
        Result := AdjustTokenPrivileges(Token,false,TP,sizeof(TPPre),TPPre,dwLength);
      end;
      finally
        CloseHandle(Token);
      end;
    end;调用:
      SetPrivilege('SeShutdownPrivilege',true);
      ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF,0);