VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html 本文介绍通过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标识当前程序是否允许通过防火墙进行通信。