设置防火墙,让你的程序畅通无阻

在我们的程序运行过程中,如果要访问网络,经常会遇到Windows的防火墙提示(如果用户打开Windows防火墙),让用户选择是否阻止,如果我们是良民,何不直接通知Windows系统,好言相劝,我想,Windows应该还是认得好人的,比如,像我这样的青年。

事实上,Windows提供了接口供我们配置防火墙。我们只需要调用接口的方法,在防火墙的配置中加入将我们的程序发布的相关信息就可以了。

这一接口要求用户系统版本至不得xp sp2用户。权限为管理员权限(这个几乎可以忽略,但还是要提醒一下)

设置Windows防火墙的接口比较多,在这个Demo中主要用了以下几种:
INetFwMgr:从字面意思上也可以看出这个接口提供了防火墙管理的方法,比如取得配

置信息。继承自IUnknow,IDispatch
INetFwProfile:通过这个接口可以取得防火墙的配置文件,比如有那些应该程序是被援

权了的。
INetFwPolicy:继承自IUnknow,IDispatch。通过这个接口我可以得到当前防火墙的访

问策略。

好了,不多说了,还是上代码先:

关于代码的说明:

1。以下代码在Visual Studio 2005 3级警告下通过编译,0 warning,0 error

 

2,用户可能会提示找不到文件netfw.h,用户可以从这里下载(http://files.cnblogs.com/homeofish/netfw.txt),下载后请放到你的VS安装目录下的Include下,比如我的就是:C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include/netfw.h,可以放到你的工程目录下,但不建议。

 

工程代码可以从这里下载:http://files.cnblogs.com/homeofish/FireWallSet.rar

 

工程中有以下全局变量:

  1. //Global Data
  2. INetFwMgr *g_pFwMgr = NULL;
  3. INetFwProfile *g_pFwProfile = NULL;
  4. INetFwPolicy *g_pFwProlicy = NULL;

 

首先是初始化的代码:

  1. bool Initial()
  2. {
  3.     CoInitializeEx(NULL,COINIT_MULTITHREADED);
  4.     HRESULT hr = CoCreateInstance(__uuidof(NetFwMgr), 0, CLSCTX_INPROC_SERVER,__uuidof(INetFwMgr),reinterpret_cast<void **>(&g_pFwMgr));
  5.     if (SUCCEEDED(hr) && (g_pFwMgr != NULL))
  6.     {
  7.         hr = g_pFwMgr->get_LocalPolicy( &g_pFwProlicy );
  8.         if (SUCCEEDED(hr) && (g_pFwProlicy != NULL))
  9.         {
  10.             hr = g_pFwProlicy->get_CurrentProfile( &g_pFwProfile );
  11.         }
  12.     }
  13.     return SUCCEEDED(hr) && (g_pFwProfile != NULL);
  14. }

 

然后是遍历所有援权程序的代码,

 

  1. void GetAuthorizedApp()
  2. {
  3.     if (g_pFwProfile)
  4.     {
  5.         HRESULT hr = S_FALSE;
  6.         INetFwAuthorizedApplications *pAuthrizedApp = NULL;
  7.         hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
  8.         if ( SUCCEEDED(hr) )
  9.         {
  10.             long nAuthCount = 0;
  11.             hr = pAuthrizedApp->get_Count(&nAuthCount);
  12.             if (SUCCEEDED(hr))
  13.             {
  14.                 //取得AppName
  15.                 USES_CONVERSION;
  16.                 cout << "安全程序个数:" << nAuthCount << endl << endl;
  17.                 IEnumVARIANT *pEnum = NULL;
  18.                 hr = pAuthrizedApp->get__NewEnum((IUnknown**)&pEnum);
  19.                 if ( SUCCEEDED(hr) )
  20.                 {
  21.                     VARIANT varCurrPosi;
  22.                     VariantInit(&varCurrPosi);
  23.                     int nGet;
  24.                     while( 1 )
  25.                     {
  26.                         hr = pEnum->Next(1,(VARIANT *)&varCurrPosi,(ULONG*)&nGet);
  27.                         if (SUCCEEDED(hr))
  28.                         {
  29.                             if (nGet > 0)
  30.                             {
  31.                                 IDispatch *pDisp = V_DISPATCH(&varCurrPosi);
  32.                                 INetFwAuthorizedApplication *app = NULL;
  33.                                 if (SUCCEEDED(pDisp->QueryInterface(__uuidof(INetFwAuthorizedApplication), (void**)&app)))
  34.                                 {
  35.                                     BSTR appName;
  36.                                     BSTR appPath;
  37.                                     VARIANT_BOOL bIsEnable = VARIANT_FALSE;
  38.                                     app->get_Name(&appName);
  39.                                     app->get_ProcessImageFileName(&appPath);
  40.                                     app->get_Enabled(&bIsEnable);
  41.                                     cout << "应用程序:" << W2A((LPTSTR)appName) << endl;
  42.                                     cout << "路径:" << W2A((LPTSTR)appPath) << endl;
  43.                                     cout << "当前是否可用:" << (VARIANT_TRUE == bIsEnable  ? "可用" : "不可用") << endl << endl;
  44.                                     app->Release();
  45.                                     app = NULL;
  46.                                     SysFreeString(appName);
  47.                                     SysFreeString(appPath);
  48.                                 }
  49.                             }
  50.                         }
  51.                         else
  52.                         {
  53.                             //异常退出
  54.                             cout << "枚举过程中失败,程序异常退出!" << endl;
  55.                         }
  56.                     }
  57.                 }
  58.                 pEnum->Release();
  59.                 pAuthrizedApp->Release();
  60.                 pAuthrizedApp = NULL;
  61.             }
  62.         }
  63.     }
  64. }

最后最重要的一点,我们要设置我们自己的程序,使其成为授权程序:

需要说明的一点是不要用一个文件不存在的名字来调试程序,比如乱写一个字符串,Windows防火墙会检查文件名是否存在!

  1. HRESULT AddApplication(const CString& appName,const CString& appPath)
  2. {
  3.     HRESULT hr = S_FALSE;
  4.     if (g_pFwProfile)
  5.     {
  6.         INetFwAuthorizedApplications *pAuthrizedApp = NULL;
  7.         hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
  8.         if ( SUCCEEDED(hr) )
  9.         {
  10.             INetFwAuthorizedApplication *pFwAuthApp = NULL;
  11.             BSTR bstrAppName = SysAllocString(appName);
  12.             BSTR bstrAppPath = SysAllocString(appPath);
  13.             hr = pAuthrizedApp->Item(bstrAppPath,&pFwAuthApp);
  14.             if ( SUCCEEDED(hr) )
  15.             {
  16.                 if (pFwAuthApp)
  17.                 {
  18.                     VARIANT_BOOL bIsEnable = VARIANT_FALSE;
  19.                     if ( SUCCEEDED(pFwAuthApp->get_Enabled(&bIsEnable)) )
  20.                     {
  21.                         if ( VARIANT_TRUE != bIsEnable)
  22.                         {
  23.                             pFwAuthApp->put_Enabled(VARIANT_TRUE);
  24.                         }   
  25.                     }
  26.                 }
  27.             }
  28.             if (!pFwAuthApp)
  29.             {
  30.                 //没有找到,加入
  31.                 hr = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER,
  32.                     __uuidof(INetFwAuthorizedApplication), (void**)&pFwAuthApp);
  33.                 if ( SUCCEEDED(hr) )
  34.                 {
  35.                     pFwAuthApp->put_Name(bstrAppName);
  36.                     pFwAuthApp->put_ProcessImageFileName(bstrAppPath);
  37.                     if ( pAuthrizedApp )
  38.                     {
  39.                         hr = pAuthrizedApp->Add( pFwAuthApp );
  40.                     }
  41.                 }
  42.             }
  43.             if (pFwAuthApp)
  44.             {
  45.                 pFwAuthApp->Release();
  46.                 pFwAuthApp = NULL;
  47.             }
  48.             SysFreeString(bstrAppName);
  49.             SysFreeString(bstrAppPath);
  50.         }
  51.         if (pAuthrizedApp)
  52.         {
  53.             pAuthrizedApp->Release();
  54.             pAuthrizedApp = NULL;
  55.         }
  56.     }
  57.     return hr;
  58. }

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值