// Shutdown.cpp#include "stdafx.h"
#include "Shutdown.h"int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
ExitWindowsEx(EWX_REBOOT, EWX_FORCE);
return 0;
}不能重启系统,为什么?

解决方案 »

  1.   

    TOKEN_PRIVILEGES tkp,tkpnewbutignored;
    HANDLE hdltokenhandle;
    LUID tmpluid;
    BOOL rc;
    DWORD lbufferneeded;
    HANDLE  hdlprocesshandle = GetCurrentProcess();
    rc = OpenProcessToken(hdlprocesshandle,
            TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hdltokenhandle);
    rc = LookupPrivilegeValue("","SeShutdownPrivilege", &tmpluid);
    tkp.PrivilegeCount = 1; // one privilege to set
    tkp.Privileges[0].Luid = tmpluid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    rc = AdjustTokenPrivileges(hdltokenhandle,FALSE,
            &tkp,sizeof(tkpnewbutignored),&tkpnewbutignored, &lbufferneeded);
    ExitWindowsEx(EWX_REBOOT, EWX_FORCE);
      

  2.   

    为了关闭或重起系统,必须先调用AdjustTokenPrivileges()函数来是SE_SHUTDOWN_NAME权限有效,webber84(***闭关修炼中***)写的就是这个意思!
    另外在win98/me中,ExitWindowEx不能在Console application中使用。
      

  3.   

    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
         // TODO: Place code here.
        TOKEN_PRIVILEGES tkp,tkpnewbutignored;
        HANDLE hdltokenhandle;
        LUID tmpluid;
        BOOL rc;
        DWORD lbufferneeded;
        HANDLE  hdlprocesshandle = GetCurrentProcess();
        rc = OpenProcessToken(hdlprocesshandle,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hdltokenhandle);
        rc = LookupPrivilegeValue("","SeShutdownPrivilege", &tmpluid);
        tkp.PrivilegeCount = 1; // one privilege to set
        tkp.Privileges[0].Luid = tmpluid;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        rc = AdjustTokenPrivileges(hdltokenhandle,FALSE,&tkp,sizeof(tkpnewbutignored),&tkpnewbutignored, &lbufferneeded);
        ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,  0);
        return 0;
    }
      

  4.   

    void ShutDown()
    {    if  (dwVersion  <    0x80000000)
        {
        TOKEN_PRIVILEGES tkp,tkpnewbutignored;
        HANDLE hdltokenhandle;
        LUID tmpluid;
        BOOL rc;
        DWORD lbufferneeded;
        HANDLE  hdlprocesshandle = GetCurrentProcess();
        rc = OpenProcessToken(hdlprocesshandle,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hdltokenhandle);
        rc = LookupPrivilegeValue("","SeShutdownPrivilege", &tmpluid);
        tkp.PrivilegeCount = 1; // one privilege to set
        tkp.Privileges[0].Luid = tmpluid;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        rc = AdjustTokenPrivileges(hdltokenhandle,FALSE,&tkp,sizeof(tkpnewbutignored),&tkpnewbutignored, &lbufferneeded);
        ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,  0);
        }
        else
        {
        ExitWindowsEx(EWX_SHUTDOWN,0);
        }
    }