我们现在开发了一个proxy,它是客户端界面与服务器之间的一个“中转站”,正由于它是一个网络控制程序,每当第一次使用客户端界面启动它的时候,就会出现Windows防火墙阻止该程序的提示,在体验上大打折扣。
有高手知道怎么在程序中规避这个问题的还请不吝赐教!

解决方案 »

  1.   

    我有个想法,我向在一个MFC程序中自动向防火墙的例外中添加proxy进程,可能要调用相关的API,现在就是不知道有什么API可以实现这个功能,谁有主意的给的回复!
      

  2.   

    http://hi.baidu.com/zzf421/blog/item/a5bfd4eedbea1df3b2fb95dd.html
      

  3.   

    公司打不开百度,故复制过来,见谅!防火墙与注册表
    2009-03-30 10:52
    年前写的一个程序。目的程序在打开端口的时候,系统自带的防火墙不能有提示GetCurrentAppPath(m_strPath);
    m_strExePathName = m_strPath+L"demo.exe";   //得到完整的路径
    RootKey=HKEY_LOCAL_MACHINE;     //注册表主键名称
    SubKey=L"SYSTEM\\ControlSet001\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile\\AuthorizedApplications\\List"; //欲打开注册表值的地址
    ValueName=m_strExePathName.GetBuffer();               //欲设置值的名称
    m_ExeRegeValue = m_strExePathName+L":*:Enabled:";    //Enabled白名单。Disabled黑名单SetContent_S = LPBYTE(m_ExeRegeValue.GetBuffer());m_nExeRegeValueLength = m_ExeRegeValue.GetLength()*sizeof(TCHAR);if((SetValue_S(RootKey,SubKey,ValueName,SetContent_S))!=0)
       AfxMessageBox(L"操作失败!");///////////////////////////////////函数名:SetValue//作用:修改注册表键值//////////////////////////////int XXXX::SetValue_S (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPBYTE ReSetContent_S)
    {
    int i=0; //操作结果:0==succeed
    //int StrLength;
    //StrLength=CString(SetContent_S).GetLength();if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
    {
         if(RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,m_nExeRegeValueLength)!=ERROR_SUCCESS)
       {
        AfxMessageBox(L"错误:无法设置有关的注册表信息");
        i=1;
       }
       RegCloseKey(hKey);
    }
    else
    {
       AfxMessageBox(L"错误:无法查询有关的注册表信息");
       i=1;
    }
    return i;
    }防火墙的注册表位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\ListHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List
     
      

  4.   


    360防火墙呢?它还不支持程序发送的鼠标点击消息(key_event)。
      

  5.   

    如arpnet99所说,我向注册表添加了白名单了,怎么在我把防火墙例外中的proxy删掉后重新运行proxy还是会出现阻止程序的提示窗啊?有其他方法吗?// 设置防火墙
    //CString cstrPath = "E:\\IPTV\\installation\\stuff\\Proxy.exe"; //GetCurrentAppPath(m_strPath);
    m_strExePathName = "E:\\IPTV\\installation\\stuff\\Proxy.exe"; //得到完整的路径
    HKEY RootKey=HKEY_LOCAL_MACHINE; //注册表主键名称
    CString SubKey="SYSTEM\\ControlSet001\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile\\AuthorizedApplications\\List"; //欲打开注册表值的地址
    //string strValueName =m_strExePathName.GetBuffer(); 
    CString ValueName = m_strExePathName; //欲设置值的名称
    m_ExeRegeValue = m_strExePathName + ":*:Enabled:"; //Enabled白名单。Disabled黑名单 LPBYTE SetContent_S = LPBYTE(m_ExeRegeValue.GetBuffer()); m_nExeRegeValueLength = m_ExeRegeValue.GetLength()*sizeof(CString); if((SetValue_S(RootKey,SubKey,ValueName,SetContent_S))!=0)
    MessageBox("操作失败!");//函数名:SetValue//作用:修改注册表键值//////////////////////////////int CFangHuoQiangDlg::SetValue_S (struct HKEY__*ReRootKey,CString ReSubKey,CString ReValueName,LPBYTE ReSetContent_S)
    {
    int i=0; //操作结果:0==succeed
    //int StrLength;
    //StrLength=CString(SetContent_S).GetLength();
    HKEY hKey; if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
    {
    if(RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,m_nExeRegeValueLength)!=ERROR_SUCCESS)
    {
    MessageBox("错误:无法设置有关的注册表信息");
    i=1;
    }
    RegCloseKey(hKey);
    }
    else
    {
    MessageBox("错误:无法查询有关的注册表信息");
    i=1;
    }
    return i;
    }
    如arpnet99所说,我向注册表添加了白名单了,怎么在我把防火墙例外中的proxy删掉后重新运行proxy还是会出现阻止程序的提示窗啊?有其他方法吗?
      

  6.   


    现在只要能首次打开proxy不出现Windows防火墙阻止程序提示就好了,加入白名单后,我运行了还是会出现,除非在防火墙例外中添加了proxy。现在我想MFC怎么实现向防火墙例外中添加proxy程序?
      

  7.   


    [size=14px]那还要实现网络服务的开关才行啊?在添加注册表前关闭服务,添加完再开启吗?
    这样就遇到新问题了,网络服务怎么开关呢?麻烦提供个方法吧。[/size]
      

  8.   

    解决了!在程序中,对Proxy临时开关,在这之间加入写注册表代码就可以成功向防火墙例外中添加程序了。
    不过,我发现,不同的电脑应该写入的注册表项不同。
    比如我的电脑是上面说的,
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\ListHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List而公司里的是,
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\AuthorizedApplications\ListHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\AuthorizedApplications\List所以,我建议这四个都给写进去,可确保万无一失。
    另外,在Windows防火墙服务没有开启的情况下,照上面的方法也照样可以成功写例外。