OSVERSIONINFO oi;
    oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&oi);     if (oi.dwPlatformId == VER_PLATFORM_WIN32_NT) 
 {
       HANDLE handle;
       TOKEN_PRIVILEGES tkp;       OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);       tkp.PrivilegeCount = 1;  // one privilege to set    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
 
       AdjustTokenPrivileges(handle, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, 0);
 } ::ExitWindowsEx(ShutdownFlag,0);在win2000server下也能关机,在关机前提是一个cmd.exe错误!请问何故?? :) 谢谢!!

解决方案 »

  1.   

    在windows2000下关机需要足够的权限!
      

  2.   

    楼主,CMD.EXE报错,应该和你的程序没有关系吧?
    我想是其他原因,和你的程序无关。
      

  3.   

    static HANDLE hToken;
    static TOKEN_PRIVILEGES tp;
    static LUID luid;
    ::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ;
    ::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    ::AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
    ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
      

  4.   

    http://community.csdn.net/Expert/topic/3157/3157550.xml?temp=.2972681
      

  5.   

    权限他已经取得了,可能和你的程序没没关系,CMD.EXE好象是DOS的SHELL吧,是不是有什么CONSOLE程序无法关闭了
      

  6.   

    2003下都好使的BOOL __stdcall  Shutdown(BOOL bForce)
    {
    OSVERSIONINFOEX osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((OSVERSIONINFO *)&osvi))
    {
      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
      if (!GetVersionEx ( (OSVERSIONINFO *) &osvi)) 
     return FALSE;
    } BOOL bIsNt = FALSE;
    if (VER_PLATFORM_WIN32_WINDOWS == osvi.dwPlatformId)
    bIsNt = FALSE;
    else if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId)
    bIsNt = TRUE; DWORD dwType = 0;
    if (bForce) dwType = EWX_FORCE; if ( !bIsNt )
    {
    ExitWindowsEx(EWX_LOGOFF|EWX_SHUTDOWN|dwType, 0);
    }
    else
    {
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp;  // Get a token for this process. 
    if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) 
    {
    MessageBox(NULL, "´ò¿ª½ø³Ì±êʶ³ö´í", "ÓêÈËÈí¼þ", MB_OK); 
    return FALSE;
    }

    // Get the LUID for the 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 the shutdown privilege for this process. 
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);  // Cannot test the return value of AdjustTokenPrivileges. 
    if (GetLastError() != ERROR_SUCCESS) 
    {
    return FALSE;
    } //now  we  can reboot;
    ExitWindowsEx( EWX_LOGOFF|EWX_SHUTDOWN|dwType, 0 );
    } if (GetLastError() != ERROR_SUCCESS) 
    {
    return FALSE;
    } return TRUE;
    }