vc 6.0 中使用ExitWindowsEx注销操作直接可以成功。但关机和重起都失败了。
关机时是不是还要设置process特权阿?
请大虾指教。

解决方案 »

  1.   

    参考一下~http://community.csdn.net/Expert/TopicView3.asp?id=5060115
      

  2.   

    void ShutDown(void)
    {
     OSVERSIONINFO osv;
     osv.dwOSVersionInfoSize=sizeof OSVERSIONINFO;
     GetVersionEx(&osv);
     if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT)
     {
      HANDLE hProcess,hToken;
      TOKEN_PRIVILEGES Privileges;
      LUID luid;
      hProcess=GetCurrentProcess();
      OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
      Privileges.PrivilegeCount=1;
      LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
      Privileges.Privileges[0].Luid=luid;
      Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
      AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
     }
     ExitWindowsEx(EWX_POWEROFF,0);
    }
      

  3.   

    void ShutDown()
    {
    OSVERSIONINFO osversioninfo;
    osversioninfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    GetVersionEx(&osversioninfo);
    int nID=osversioninfo.dwPlatformId;
    if(nID<=1)
    goto Exit;
    HANDLE Handle;
    Handle=::GetCurrentProcess();
    HANDLE HandleProcess;
    OpenProcessToken(Handle,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&HandleProcess);
    LUID tmpLuid;
    LookupPrivilegeValue(NULL,"SeShutdownPrivilege",&tmpLuid);
    TOKEN_PRIVILEGES tkpNew;
    TOKEN_PRIVILEGES tkpPrevious;
    tkpNew.PrivilegeCount=1;
    tkpNew.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    tkpNew.Privileges[0].Luid=tmpLuid;
    DWORD lbufferNeeded;
    AdjustTokenPrivileges(HandleProcess,false,&tkpNew,sizeof(tkpPrevious),&tkpPrevious,&lbufferNeeded);
    Exit:
    ExitWindowsEx(EWX_FORCE|EWX_REBOOT,0);
    }