VC++检测防火墙是否开启判断程序是否加入防火墙白名单(附源码)
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++检测防火墙是否开启判断程序是否加入防火墙白名单(附源码)相关的知识,希望对你有一定的参考价值。
本文介绍通过INetFwMgr、INetFwPolicy、INetFwProfile等COM接口去检测防火防是否开启,检测当前进程是否加入了防火墙白名单。
对于Windows10系统,启动/关闭系统防火墙的页面如下:
设置允许通过Windows防火墙进行通信的页面如下:
使用COM组件检测防火墙是否开启、检测程序是否允许通过防火墙进行通信(加入防火墙白名单)的完整代码如下:
BOOL DetectFirewallSettings( BOOL* bExeEnableFW )
BOOL status = FALSE;
HRESULT hr = S_FALSE;
INetFwMgr* fwMgr = NULL;
INetFwPolicy* fwPolicy = NULL;
INetFwProfile* fwProfile = NULL;
INetFwAuthorizedApplications *apps = NULL;
INetFwAuthorizedApplication *app = NULL;
FW_ERROR_CODE ret = FW_NOERROR;
VARIANT_BOOL bFWEnabled;
VARIANT_BOOL bDoNoteAllowExceptions;
CoInitialize( NULL );
try
// Create an instance of the firewall settings manager.
hr = CoCreateInstance( __uuidof(NetFwMgr), NULL, CLSCTX_INPROC_SERVER, __uuidof( INetFwMgr), (void**)&fwMgr );
if( FAILED( hr ) )
throw FW_ERR_CREATE_SETTING_MANAGER;
// Retrieve the local firewall policy.
hr = fwMgr->get_LocalPolicy( &fwPolicy );
if( FAILED( hr ) )
throw FW_ERR_LOCAL_POLICY;
// Retrieve the firewall profile currently in effect
hr = fwPolicy->get_CurrentProfile( &fwProfile );
if( FAILED( hr ) )
throw FW_ERR_PROFILE;
// 1、是否开启了防火墙
hr = fwProfile->get_FirewallEnabled( &bFWEnabled );
if( FAILED( hr ) )
throw FW_ERR_FIREWALL_IS_ENABLED;
if( bFWEnabled )
// 开启了防火墙,再检测是否允许例外
hr = fwProfile->get_ExceptionsNotAllowed( &bDoNoteAllowExceptions );
if( FAILED(hr) )
throw FW_ERR_FIREWALL_IS_ENABLED;
if( bDoNoteAllowExceptions )
status = TRUE;
else
// 允许意外
// 2、得到授权应用程序
hr = fwProfile->get_AuthorizedApplications( &apps );
if( FAILED(hr) )
status = TRUE;
throw FW_ERR_FIREWALL_IS_ENABLED;
// 3、获取当前进程的进程名
TCHAR szPEBuff[MAX_PATH] = 0;
GetModuleFileName( NULL, szPEBuff, MAX_PATH );
BSTR bstrTemp = _bstr_t( szPEBuff );
// 看当前进程在不在允许列表中
hr = apps->Item( bstrTemp, &app );
if( FAILED(hr) )
// 不在允许列表中
status = TRUE;
throw FW_ERR_FIREWALL_IS_ENABLED;
else
//在允许列表中,查看是否允许通过防火墙
hr = app->get_Enabled( &bFWEnabled );
if( FAILED(hr) )
status = TRUE;
throw FW_ERR_FIREWALL_IS_ENABLED;
if( bFWEnabled != VARIANT_FALSE )
status = FALSE;
if ( bExeEnableFW != NULL )
*bExeEnableFW = true;
else
status = TRUE;
catch( FW_ERROR_CODE nError )
ret = nError;
if( fwPolicy )
fwPolicy->Release();
if( fwMgr )
fwMgr->Release();
CoUninitialize();
return status;
上述接口的返回值标识防护墙是否开启,接口的传出参数bExeEnableFW标识当前程序是否允许通过防火墙进行通信。
以上是关于VC++检测防火墙是否开启判断程序是否加入防火墙白名单(附源码)的主要内容,如果未能解决你的问题,请参考以下文章