多谢

解决方案 »

  1.   

    做关机你须做到以下2点
    1、    windows 2000、xp、2003没获得用户关机特权,没有用。怎样用以下两个windows函数 
      OpenProcessToken,LookupPrivilegeValue获得用户关机特权。
    2、    关电源,要调用ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0 )
      强制关机ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0 ); 
      

  2.   

    Shutdown()
    {
    OSVERSIONINFO OSversion;
    OSversion.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    GetVersionEx(&OSversion);

    if (OSversion.dwPlatformId==VER_PLATFORM_WIN32_NT) // Windows NT
    {
    HANDLE hToken; 
    LUID DebugValue; 
    TOKEN_PRIVILEGES tkp;
    // 
    // Retrieve a handle of the access token 
    // 
    if (!OpenProcessToken(GetCurrentProcess(), 
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, 
    &hToken)) { 
    //Your computer cannot shutdown, Check the user priviledges
    MessageBox("Your computer cannot shutdown","Warning",MB_ICONERROR | MB_OK);
    return;


    // 
    // Enable the SE_SHUTDOWN_NAME privilege 
    // 
    if (!LookupPrivilegeValue((LPSTR) NULL, 
    SE_SHUTDOWN_NAME, 
    &DebugValue)) { 
    //Your computer cannot shutdown, Check the user priviledges
    MessageBox("Your computer cannot shutdown","Warning",MB_ICONERROR | MB_OK);
    return;


    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Luid = DebugValue; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    AdjustTokenPrivileges(hToken, 
    FALSE, 
    &tkp, 
    sizeof(TOKEN_PRIVILEGES), 
    (PTOKEN_PRIVILEGES) NULL, 
    (PDWORD) NULL); 

    // 
    // The return value of AdjustTokenPrivileges can't be tested 
    // 
    if (GetLastError() != ERROR_SUCCESS) { 
    //Your computer cannot shutdown, Check the user priviledges
    MessageBox("Your computer cannot shutdown","Warning",MB_ICONERROR | MB_OK);
    return;


    }

        // Power off the computer
        // shutdown branching added by Dragongodz

    switch(OSversion.dwPlatformId)
    {
    case VER_PLATFORM_WIN32_NT:
    ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0);
    break;
    case VER_PLATFORM_WIN32_WINDOWS: 
    ExitWindowsEx(EWX_SHUTDOWN, 0);
        }
    }
      

  3.   

    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    ExitWindowsEx(EWX_POWEROFF, 0);/*
     关闭类型(UINT uFlags)可以是以下几种:  
     EWX_FORCE:强制关闭,Windows不会发送任何消息给正运行的程序,这可能导致数据丢失;   EWX_LOGOFF:关闭所有正在运行的程序,注销当前用户并重新登录;  
     EWX_POWEROFF:关闭Windows并关机,系统必须支持电源管理;  
     EWX_REBOOT:关闭Windows并重新启动;  
     EWX_SHUTDOWN:关闭Windows,缓冲区内的数据将被写入磁盘。
    */