windows系统防火墙应用程序出入站实现添加

使用com 组件:

 具体实现如下:

 

复制代码
using System;
using NetFwTypeLib;

namespace FireWall
{
    public static class FireWallHelper
    {
        /// <summary>
        /// 将应用程序添加到防火墙例外
        /// </summary>
        /// <param name="ruleName">应用程序名称</param>
        /// <param name="applicationPath">应用程序可执行文件全路径</param>
        public static void NetFwAddApps(string ruleName, string applicationPath)
        {
            // 创建一个COM对象来访问Windows防火墙设置
            var type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
            var firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(type);

            // 创建一个防火墙出站规则对象
            var firewallRuleOut = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));

            // 设置防火墙规则的属性
            firewallRuleOut.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
            firewallRuleOut.Description = "Allow outbound traffic for My Application";
            firewallRuleOut.ApplicationName = applicationPath;
            firewallRuleOut.Name = ruleName;
            firewallRuleOut.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
            firewallRuleOut.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
            firewallRuleOut.Enabled = true;

            // 创建一个防火墙入站规则对象
            var firewallRuleIn = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));

            // 设置防火墙规则的属性
            firewallRuleIn.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
            firewallRuleIn.Description = "Allow outbound traffic for My Application";
            firewallRuleIn.ApplicationName = applicationPath;
            firewallRuleIn.Name = ruleName;
            firewallRuleIn.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
            firewallRuleIn.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
            firewallRuleIn.Enabled = true;

            var isExistsRuleOut = false;
            var isExistsRuleIn = false;
            // 遍历规则集合,检查规则名称是否存在
            foreach (INetFwRule rule in firewallPolicy.Rules)
            {
                if (rule.Name == ruleName)
                {
                    if (rule.Direction == firewallRuleOut.Direction)
                    {
                        isExistsRuleOut = true;
                    }

                    if (rule.Direction == firewallRuleIn.Direction)
                    {
                        isExistsRuleIn = true;
                    }
                }
            }

            if (!isExistsRuleOut)
            {
                // 将出站规则添加到防火墙策略中
                firewallPolicy.Rules.Add(firewallRuleOut);
            }

            if (!isExistsRuleIn)
            {
                // 将出站规则添加到防火墙策略中
                firewallPolicy.Rules.Add(firewallRuleIn);
            }
        }
    }
}
复制代码

 

posted on   TanZhiWei  阅读(34)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示