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 | EWX_SHUTDOWN | EWX_FORCE ,0);

解决方案 »

  1.   

    改为::ExitWindowsEx(EWX_POWEROFF, 0);
      

  2.   

    改为ExitWindowsEx(EWX_POWEROFF, 0);也不行呀
    还是从起
      

  3.   

    ExitWindowsEx( EWX_FORCE |EWX_SHUTDOWN  ,0);
      

  4.   

    void CCMPCtrlDlg::ShutDownComputer()
    {
    HANDLE hToken;              // handle to process token 
    TOKEN_PRIVILEGES tkp;       // pointer to token structure 
     
    if( !OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
    &hToken) )
    {
    // 说明运行于98模式下
    if( ExitWindowsEx(EWX_SHUTDOWN,0) != 0 )
    EndDialog(IDOK); return;
    }         //下面的代码是用于2000下的
             //修改权限 // Get the LUID for shutdown privilege. 
     
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
    &tkp.Privileges[0].Luid); 
     
    tkp.PrivilegeCount = 1;  // one privilege to set    
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
     
    // Get shutdown privilege for this process. 
     
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
    (PTOKEN_PRIVILEGES) NULL, 0); 
     
    //
    // The return value of AdjustTokenPrivileges can't be tested     
    //
    if (GetLastError() != ERROR_SUCCESS) 
    {
    MessageBox("Adjuste error! ");
    return;
    } if( ExitWindowsEx(EWX_SHUTDOWN,0) == 0 )
    return;
    else
    EndDialog(IDOK);
    }