以下文章中演示了在Windows NT 4.0/Windows 2000上调用ExitWindowsEx API的方法,并且包含了如何获得SE_SHUTDOWN_NAME权限的方法,您可以参考:  PRB: ExitWindowsEx API Does Not Reboot Windows NT
  http://support.microsoft.com/directory/article.asp?ID=KB;EN-US;Q176695   在WindowsNT/2000/XP中,您无法直接通过ExitWindowsEx关闭计算机,而必须先调用AdjustTokenPrivileges 函数使得SE_SHUTDOWN_NAME的privilege为有效,请参考以下文章,他说明了如何关闭Windows NT/2000/XP: 
  
  PRB: ExitWindowsEx API Does Not Reboot Windows NT (Q176695) 
  http://support.microsoft.com/default.aspx?scid=kb;en-us;Q176695

解决方案 »

  1.   

    关机:
    TOKEN_PRIVILEGES tp,tpnewbutignored;
    HANDLE hdltokenhandle;
    LUID tmpluid;
    DWORD lbufferneeded;
    HANDLE  hdlprocesshandle = GetCurrentProcess();
    ...........
    OpenProcessToken(hdlprocesshandle,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hdltokenhandle);
    ...........
             LookupPrivilegeValue("","SeShutdownPrivilege", &tmpluid);
    tp.PrivilegeCount = 1; 
    tp.Privileges[0].Luid = tmpluid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;...........
             AdjustTokenPrivileges(hdltokenhandle,FALSE,&tkp,sizeof(tpnewbutignored),&tkpnewbutignored, &lbufferneeded);
            ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,  0);
          OR(或)
            ExitWindowsEx(EWX_SHUTDOWN,0);
    注:这样做可能不太是好的关机的方法;还需要有版本信息(作为判断使用)和关机的权利