WIN2000下
锁定计算机后,我想实现定时自动关机,现在有两个问题:
1:WIN2000关闭系统的程序的路径?
2:如何自动解除锁定?
有没有人做个的程序参考一下。

解决方案 »

  1.   

    我试过了,在CMainFrame::OnDestroy()中调用ExitWindows不行
      

  2.   

    在WINDOWS 2000中要有关机的权限才能够关闭计算机,单ExitWindows函数是不行的,调用调整权限的函数使应用程序具有关机的权限,然后调用关机函数就OK了。
      

  3.   

    顺便问问,Win98和Win2K的关机方法好像不同,谁知道分别如何实现的?
      

  4.   

    我给你一段代码吧,下面是我的关机程序的部分代码void CShutDownView::OnLogoff() 
    {
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
    LUID sedebugnameValue; 
    if(!IsWin98())
    {
    if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    return ; 
    if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )

    CloseHandle( hToken );
    return ;

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Luid = sedebugnameValue; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
    CloseHandle( hToken ); 
    }
    if(!ExitWindowsEx(EWX_LOGOFF,0L))
    AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。


    }void CShutDownView::OnExit() 
    {
    CWnd* pMainWindow = AfxGetMainWnd();

    ::PostMessage(pMainWindow->m_hWnd,WM_CLOSE,0,0);
    }void CShutDownView::OnRestart() 
    {
    /*
    步骤:
    1、opens the access token associated with a process.
    */ HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
    LUID sedebugnameValue; 
    if(!IsWin98())
    {
    if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    return ; 
    /*  The LookupPrivilegeValue function retrieves the locally unique identifier (LUID)
    used on a specified system to locally represent the specified privilege name. 
    BOOL LookupPrivilegeValue(
      LPCTSTR lpSystemName,// address of string specifying the system
       
      LPCTSTR lpName,  // address of string specifying the privilege
      PLUID lpLuid     // address of locally unique identifier
    );
    */ 
    if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )

    CloseHandle( hToken );
    return ;

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Luid = sedebugnameValue; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    /*
    The AdjustTokenPrivileges function enables or disables privileges in the specified access token. Enabling or disabling privileges in an access token requires TOKEN_ADJUST_PRIVILEGES access. 
    TokenPrivileges(
    HANDLE TokenHandle,  // handle to token that contains privileges
    BOOL DisableAllPrivileges,// flag for disabling all privileges
    PTOKEN_PRIVILEGES NewState,// pointer to new privilege information
    DWORD BufferLength,  // size, in bytes, of the PreviousState buffer
    PTOKEN_PRIVILEGES PreviousState, // receives original state of changed privileges
    PDWORD ReturnLength  // receives required size of the  PreviousState buffer
    );*/
     
    AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
    CloseHandle( hToken ); 
    }
    if(!ExitWindowsEx(EWX_REBOOT,0L))
    AfxMessageBox("重新启动失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。
    }void CShutDownView::OnShutdown() 
    { HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
    LUID sedebugnameValue; 
    if(!IsWin98())
    {
    if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    return ; 
    if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )

    CloseHandle( hToken );
    return ;

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Luid = sedebugnameValue; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
    CloseHandle( hToken ); 
    }
    if(!ExitWindowsEx(EWX_SHUTDOWN,0L))
    AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。 }
    void CShutDownView::OnPoweroff() 
    { HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
    LUID sedebugnameValue; 
    if(!IsWin98())
    { if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    return ; 
    if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )

    CloseHandle( hToken );
    return ;

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Luid = sedebugnameValue; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
    CloseHandle( hToken ); 
    }
    if(!ExitWindowsEx(EWX_POWEROFF,0L))
    AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。

    }BOOL CShutDownView::IsWin98()
    {
    DWORD dwVersionNum = GetVersion();
    if(dwVersionNum<0x80000000)//NT
    return FALSE;
    else                       //WIN98
    return TRUE;
    }

      

  5.   

    这段代码应该也是可以的,先获取特权然后再.....BOOL CMainFrame::shutdown()
    {
    HANDLE           hToken;    
    TOKEN_PRIVILEGES tkp;      
    BOOL             fResult;     // Get the current process token handle so we can get shutdown privilege.  
    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))    
    return FALSE;  // Get the LUID for shutdown privilege.  
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);  
    tkp.PrivilegeCount = 1;  
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  // Get 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;   
    // Actually shutdown  
    fResult = InitiateSystemShutdown(NULL, NULL, 0, TRUE, FALSE);  
    // to shutdown  
    // fResult = InitiateSystemShutdown(NULL, NULL, 0, TRUE, TRUE);   
    // to reboot   
    if(!fResult)    
    return FALSE;    // Disable shutdown privilege.  
    tkp.Privileges[0].Attributes = 0;  
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);   
    if(GetLastError() != ERROR_SUCCESS)    
    return FALSE;   
    return TRUE;
    }