如何用vc实现在win98 and win2000下的远程关机和重启(可以在远程机上加载一定的程序,最好给出源代码)

解决方案 »

  1.   

    必须在远程机上加载一定的程序。
    1。对于98,简单! ExitWindowsEx(具体参数); 就ok了。
    当然你要建立一个侦听的SOCKET,收到信息进行判断,决定是否关机,不要告诉我
    你不懂网络编程。
    2。对于2000,首先要获得关机的权限,不然你只能做到注销。
    代码如下:
    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 ); 
    然后就和98一样了。BTW,哥们,你给的分少了点吧!
      

  2.   

    我的意思是想用SE_RAMOTE_SHUTDOWN_NAME不需要SOCKET即可以实现的!!再帮帮我吧多谢!!
      

  3.   

    InitiateSystemShutdown不支持95,98,ME
      

  4.   

    那,2000 or NT该怎么做??
      

  5.   


    BOOL WINAPI PL_ExitWindow(UINT uFlag)
    {
    HANDLE hToken = NULL;
    TOKEN_PRIVILEGES tkp;
    BOOL fResult = FALSE;
    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
    if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
    {
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    if(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0))
    {
    return ::ExitWindowsEx(uFlag, 0);
    }
    }
    }

    return ::ExitWindowsEx(uFlag, 0);
    }void CShutDownDlg::OnOK() 
    {
    OSVERSIONINFO ver;
    ZeroMemory(&ver, sizeof(OSVERSIONINFO));
    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&ver);
    int nID = GetCheckedRadioButton(IDC_RADIO_LOGOFF, IDC_RADIO_SHUTDOWN);
    BOOL bForce = ((CButton*)GetDlgItem(IDC_CHECK_FORCE))->GetCheck();
    int nSel = nID - IDC_RADIO_LOGOFF;
    UINT uFlag = bForce ? EWX_FORCE : 0;
    switch(nSel)
    {
    case 0:
    uFlag |= EWX_LOGOFF;
    break ;
    case 1:
    uFlag |= EWX_REBOOT;
    break ;
    case 2:
    {
    if(ver.dwMajorVersion <= 4)
    {
    uFlag |= EWX_SHUTDOWN;
    }
    else
    {
    uFlag |= (EWX_SHUTDOWN | EWX_POWEROFF);
    }
    }
    break ;
    }
    CDialog::OnOK();
    PL_ExitWindow(uFlag);
    }
      

  6.   

    可以使用不InitiateSystemShutdown在NT和2000下关机,98和me没机器试。