如何在程序中避免在运行时出现windows防火墙阻止程序的提示? 我们现在开发了一个proxy,它是客户端界面与服务器之间的一个“中转站”,正由于它是一个网络控制程序,每当第一次使用客户端界面启动它的时候,就会出现Windows防火墙阻止该程序的提示,在体验上大打折扣。有高手知道怎么在程序中规避这个问题的还请不吝赐教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我有个想法,我向在一个MFC程序中自动向防火墙的例外中添加proxy进程,可能要调用相关的API,现在就是不知道有什么API可以实现这个功能,谁有主意的给的回复! http://hi.baidu.com/zzf421/blog/item/a5bfd4eedbea1df3b2fb95dd.html 公司打不开百度,故复制过来,见谅!防火墙与注册表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 360防火墙呢?它还不支持程序发送的鼠标点击消息(key_event)。 如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还是会出现阻止程序的提示窗啊?有其他方法吗? 现在只要能首次打开proxy不出现Windows防火墙阻止程序提示就好了,加入白名单后,我运行了还是会出现,除非在防火墙例外中添加了proxy。现在我想MFC怎么实现向防火墙例外中添加proxy程序? [size=14px]那还要实现网络服务的开关才行啊?在添加注册表前关闭服务,添加完再开启吗?这样就遇到新问题了,网络服务怎么开关呢?麻烦提供个方法吧。[/size] 解决了!在程序中,对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防火墙服务没有开启的情况下,照上面的方法也照样可以成功写例外。 任务栏快速启动的箭头句柄如何获取 listbox中怎么确定被选中的项目 关于一组字符串分组的问题 大家谈谈对学历的看法 弱弱的问~窗口四个边角的问题 CEdit问题,100分相送,谢谢 怎样让基于mfc的对话框,以上来就最大化? 对这个公司有了解的进来说说你的看法,Up者有分 一个真正的VC程序必备的技术!参与有分 有条形码的打印软件吗? 其原因可能是堆被损坏,这说明 NewMedia.exe 中或它所加载的任何 DLL 中有 Bug 多个拆分窗口切换要怎么实现啊???
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
360防火墙呢?它还不支持程序发送的鼠标点击消息(key_event)。
//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还是会出现阻止程序的提示窗啊?有其他方法吗?
现在只要能首次打开proxy不出现Windows防火墙阻止程序提示就好了,加入白名单后,我运行了还是会出现,除非在防火墙例外中添加了proxy。现在我想MFC怎么实现向防火墙例外中添加proxy程序?
[size=14px]那还要实现网络服务的开关才行啊?在添加注册表前关闭服务,添加完再开启吗?
这样就遇到新问题了,网络服务怎么开关呢?麻烦提供个方法吧。[/size]
不过,我发现,不同的电脑应该写入的注册表项不同。
比如我的电脑是上面说的,
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防火墙服务没有开启的情况下,照上面的方法也照样可以成功写例外。