在我们的程序运行过程中,如果要访问网络,经常会遇到Windows的防火墙提示(如果用户打开Windows防火墙),让用户选择是否阻止,如果我们是良民,何不直接通知Windows系统,好言相劝,我想,Windows应该还是认得好人的,比如,像我这样的青年。
事实上,Windows提供了接口供我们配置防火墙。我们只需要调用接口的方法,在防火墙的配置中加入将我们的程序发布的相关信息就可以了。
这一接口要求用户系统版本至不得xp sp2用户。权限为管理员权限(这个几乎可以忽略,但还是要提醒一下)
设置Windows防火墙的接口比较多,在这个Demo中主要用了以下几种:
INetFwMgr:从字面意思上也可以看出这个接口提供了防火墙管理的方法,比如取得配
置信息。继承自IUnknow,IDispatch
INetFwProfile:通过这个接口可以取得防火墙的配置文件,比如有那些应该程序是被援
权了的。
INetFwPolicy:继承自IUnknow,IDispatch。通过这个接口我可以得到当前防火墙的访
问策略。
事实上,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
工程中有以下全局变量:
- //Global Data
- INetFwMgr *g_pFwMgr = NULL;
- INetFwProfile *g_pFwProfile = NULL;
- INetFwPolicy *g_pFwProlicy = NULL;
首先是初始化的代码:
- bool Initial()
- {
- CoInitializeEx(NULL,COINIT_MULTITHREADED);
- HRESULT hr = CoCreateInstance(__uuidof(NetFwMgr), 0, CLSCTX_INPROC_SERVER,__uuidof(INetFwMgr),reinterpret_cast<void **>(&g_pFwMgr));
- if (SUCCEEDED(hr) && (g_pFwMgr != NULL))
- {
- hr = g_pFwMgr->get_LocalPolicy( &g_pFwProlicy );
- if (SUCCEEDED(hr) && (g_pFwProlicy != NULL))
- {
- hr = g_pFwProlicy->get_CurrentProfile( &g_pFwProfile );
- }
- }
- return SUCCEEDED(hr) && (g_pFwProfile != NULL);
- }
然后是遍历所有援权程序的代码,
- void GetAuthorizedApp()
- {
- if (g_pFwProfile)
- {
- HRESULT hr = S_FALSE;
- INetFwAuthorizedApplications *pAuthrizedApp = NULL;
- hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
- if ( SUCCEEDED(hr) )
- {
- long nAuthCount = 0;
- hr = pAuthrizedApp->get_Count(&nAuthCount);
- if (SUCCEEDED(hr))
- {
- //取得AppName
- USES_CONVERSION;
- cout << "安全程序个数:" << nAuthCount << endl << endl;
- IEnumVARIANT *pEnum = NULL;
- hr = pAuthrizedApp->get__NewEnum((IUnknown**)&pEnum);
- if ( SUCCEEDED(hr) )
- {
- VARIANT varCurrPosi;
- VariantInit(&varCurrPosi);
- int nGet;
- while( 1 )
- {
- hr = pEnum->Next(1,(VARIANT *)&varCurrPosi,(ULONG*)&nGet);
- if (SUCCEEDED(hr))
- {
- if (nGet > 0)
- {
- IDispatch *pDisp = V_DISPATCH(&varCurrPosi);
- INetFwAuthorizedApplication *app = NULL;
- if (SUCCEEDED(pDisp->QueryInterface(__uuidof(INetFwAuthorizedApplication), (void**)&app)))
- {
- BSTR appName;
- BSTR appPath;
- VARIANT_BOOL bIsEnable = VARIANT_FALSE;
- app->get_Name(&appName);
- app->get_ProcessImageFileName(&appPath);
- app->get_Enabled(&bIsEnable);
- cout << "应用程序:" << W2A((LPTSTR)appName) << endl;
- cout << "路径:" << W2A((LPTSTR)appPath) << endl;
- cout << "当前是否可用:" << (VARIANT_TRUE == bIsEnable ? "可用" : "不可用") << endl << endl;
- app->Release();
- app = NULL;
- SysFreeString(appName);
- SysFreeString(appPath);
- }
- }
- }
- else
- {
- //异常退出
- cout << "枚举过程中失败,程序异常退出!" << endl;
- }
- }
- }
- pEnum->Release();
- pAuthrizedApp->Release();
- pAuthrizedApp = NULL;
- }
- }
- }
- }
最后最重要的一点,我们要设置我们自己的程序,使其成为授权程序:
需要说明的一点是不要用一个文件不存在的名字来调试程序,比如乱写一个字符串,Windows防火墙会检查文件名是否存在!
- HRESULT AddApplication(const CString& appName,const CString& appPath)
- {
- HRESULT hr = S_FALSE;
- if (g_pFwProfile)
- {
- INetFwAuthorizedApplications *pAuthrizedApp = NULL;
- hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
- if ( SUCCEEDED(hr) )
- {
- INetFwAuthorizedApplication *pFwAuthApp = NULL;
- BSTR bstrAppName = SysAllocString(appName);
- BSTR bstrAppPath = SysAllocString(appPath);
- hr = pAuthrizedApp->Item(bstrAppPath,&pFwAuthApp);
- if ( SUCCEEDED(hr) )
- {
- if (pFwAuthApp)
- {
- VARIANT_BOOL bIsEnable = VARIANT_FALSE;
- if ( SUCCEEDED(pFwAuthApp->get_Enabled(&bIsEnable)) )
- {
- if ( VARIANT_TRUE != bIsEnable)
- {
- pFwAuthApp->put_Enabled(VARIANT_TRUE);
- }
- }
- }
- }
- if (!pFwAuthApp)
- {
- //没有找到,加入
- hr = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER,
- __uuidof(INetFwAuthorizedApplication), (void**)&pFwAuthApp);
- if ( SUCCEEDED(hr) )
- {
- pFwAuthApp->put_Name(bstrAppName);
- pFwAuthApp->put_ProcessImageFileName(bstrAppPath);
- if ( pAuthrizedApp )
- {
- hr = pAuthrizedApp->Add( pFwAuthApp );
- }
- }
- }
- if (pFwAuthApp)
- {
- pFwAuthApp->Release();
- pFwAuthApp = NULL;
- }
- SysFreeString(bstrAppName);
- SysFreeString(bstrAppPath);
- }
- if (pAuthrizedApp)
- {
- pAuthrizedApp->Release();
- pAuthrizedApp = NULL;
- }
- }
- return hr;
- }