以下文章中演示了在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
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
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);
注:这样做可能不太是好的关机的方法;还需要有版本信息(作为判断使用)和关机的权利