VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)-LMLPHPhttps://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)-LMLPHPhttps://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)-LMLPHPhttps://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)-LMLPHPhttps://blog.csdn.net/chenlycly/category_11931267.html       本文介绍通过INetFwMgr、INetFwPolicy、INetFwProfile等COM接口去检测防火防是否开启,检测当前进程是否加入了防火墙白名单。

       对于Windows10系统,启动/关闭系统防火墙的页面如下:

检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)-LMLPHP

        设置允许通过Windows防火墙进行通信的页面如下:

检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)-LMLPHP

       使用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标识当前程序是否允许通过防火墙进行通信。 

10-02 16:00