void WinShutdown(UINT ShutdownFlag)
{
    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.   

    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);
      

  2.   

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