Windows中通过C++自动添加防火墙例外规则

TechNomad / 2023-08-24 / 原文

在C++程序中无法直接控制防火墙警报窗口的显示,因为这是由操作系统和防火墙软件控制的。防火墙警报窗口是为了提醒用户程序正在尝试与外部网络进行通信,以确保用户意识到可能的网络活动。

然而,可以通过编写C++程序在用户的系统上自动添加防火墙例外规则,从而避免防火墙警报窗口的显示,以下是代码示例方法:

#include <iostream>
#include <Windows.h>
#include <netfw.h>

int add_firewall_whitelist()
{
    // 初始化COM库
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if (SUCCEEDED(hr)) {
        // 创建INetFwPolicy2对象
        INetFwPolicy2* pFwPolicy = nullptr;
        hr = CoCreateInstance(__uuidof(NetFwPolicy2), nullptr, CLSCTX_INPROC_SERVER,
            __uuidof(INetFwPolicy2), reinterpret_cast<void**>(&pFwPolicy));
        if (SUCCEEDED(hr)) {
            // 创建规则对象
            INetFwRule* pFwRule = nullptr;
            hr = CoCreateInstance(__uuidof(NetFwRule), nullptr, CLSCTX_INPROC_SERVER,
                __uuidof(INetFwRule), reinterpret_cast<void**>(&pFwRule));
            if (SUCCEEDED(hr)) {
                // 配置规则属性
                BSTR ruleName = SysAllocString(L"MyAppRule");
                pFwRule->put_Name(ruleName);
                SysFreeString(ruleName);

                BSTR exePath = SysAllocString(L"C:\\Path\\To\\Your\\Program.exe"");// 替换为你的程序路径
                pFwRule->put_ApplicationName(exePath);
                pFwRule->put_Action(NET_FW_ACTION_ALLOW);
                pFwRule->put_Direction(NET_FW_RULE_DIR_IN);
                pFwRule->put_Enabled(VARIANT_TRUE);
                pFwRule->put_Profiles(NET_FW_PROFILE2_ALL);

                // 将规则添加到防火墙策略中
                INetFwRules* pFwRules = NULL;
                hr = pFwPolicy->get_Rules(&pFwRules);
                if (SUCCEEDED(hr)) {
                    hr = pFwRules->Add(pFwRule);
                    if (SUCCEEDED(hr)) {
                        std::cout << "Rule added successfully" << std::endl;
                    }
                    pFwRules->Release();
                }
                SysFreeString(exePath);
                pFwRule->Release();
            }

            pFwPolicy->Release();
        }
        // 释放COM库资源
        CoUninitialize();
    }
    return 0;  
}