C#为WindowsDefender防火墙添加出入站规则

本文讲述用C#编写程序时添加Windows系统自带防火墙出入站规则的问题。介绍了参考微软C/C++系统防火墙操作文档改写C#代码,添加COM引用(NetFwTypeLib)、命名空间,给出添加和删除规则的主要代码,强调需管理员权限运行,测试平台为Win10专业版1809和VS2017。

在用C#编写程序的时候碰到添加windows系统自带防火墙出入站规则的问题,在网上查询相关资料只找到添加端口和程序例外的规则参考这里。有没有什么办法能够添加更加通用的,实用的出站规则呢?
微软提供了C/C++系统防火墙操作相关文档,参考这些文档改写成C#代码,使用到了COM引用。

添加COM引用
我们需要 NetFwTypeLib 引用。
在VS右上角 引用 选项里,选择 COM 页, 找到 NetFwTypeLib , 勾选,点击确定即可。

添加命名空间
using NetFwTypeLib;

主要代码

添加规则

/// <summary>
/// 为WindowsDefender防火墙添加一条规则
/// <summary>

INetFwPolicy2 policy2 = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
//创建防火墙策略类的实例
INetFwRule rule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwRule"));
//创建防火墙规则类的实例
rule.Name = “myRule”;
//为规则添加名称
rule.Description = "my first fwRule";
//为规则添加描述
rule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
//选择入站规则还是出站规则,IN为入,OUT为出
rule.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP
//为规则添加协议类型
rule.ApplicationName = exePath;
//为规则添加应用程序(注意这里是应用程序的绝对路径名)
rule.LocalAddresses = "127.0.0.1";
//为规则添加本地IP地址
rule.LocalPorts = "4040";
//为规则添加本地端口
rule.RemoteAddresses = "127.0.0.1";
//为规则添加远程IP地址
rule.RemotePorts = "4040";
//为规则添加远程端口
rule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
//设置规则是阻止还是允许(ALLOW=允许,BLOCK=阻止)
rule.Enabled = true;
//是否启用规则
try
{
	policy2.Rules.Add(rule);
	//添加规则到防火墙策略
}
catch(Exception e)
{
	//do something
}

删除规则

/// <summary>
/// 删除WindowsDefender防火墙规则
/// <summary>

INetFwPolicy2 policy2 = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
//创建防火墙策略类的实例
try
{
	policy2.Rules.Remove(ruleName);
	//根据规则名称移除规则
}
catch(Exception e)
{
	//do something
}

注意执行这部分代码需要管理员权限,编译好可执行程序,右键以管理员权限运行才不会报错
我测试的平台是Windows 10 专业版 1809,VS 2017 community
不保证所有操作系统都能运行,如果有什么问题或错误请跟我交流。

### 如何在 Windows 防火墙添加和出规则 #### 使用图形界面创建防火墙规则 对于单台计算机上的少量规则设置,可以通过图形化界面完成: 1. 打开控制面板并进入“系统和安全”,点击“Windows Defender 防火墙”。接着,在左侧菜单选择“高级设置”。 2. 右键点击“入规则”或者“出规则”,根据需求选择新建规则。 3. 新建规则向导会引导用户通过一系列选项来定义新规则的具体参数,包括但不限于程序路径、端口号等。最后一步则是指定该规则的动作(允许或阻止),以及应用范围(域网络、专用网络或是公共网络)。[^1] #### 命令行批量配置防火墙规则 面对多台设备或多条规则的需求时,采用命令行工具 `netsh` 或 PowerShell 脚本将是更高效的选择。以下是利用这两种方式实现自动化部署的例子: ##### 利用 netsh 添加单一规则 ```batch :: 创建一条允许TCP流量进出本地机器上特定端口(比如8081)的新规 netsh advfirewall firewall add rule name="Allow Port 8081" protocol=TCP dir=in localport=8081 action=allow ``` ##### 编写PowerShell脚本来批量导入规则 编写一段简单的PowerShell代码片段用于快速建立多个自定义规则: ```powershell $ports = @(80,443,8080,8081) foreach ($port in $ports){ New-NetFirewallRule -DisplayName "Allow TCP Inbound on port $port" ` -Direction Inbound ` -LocalPort $port ` -Protocol TCP ` -Action Allow } ``` 上述脚本将依次为数组 `$ports` 中列举的所有端口创建对应的入许可规则。此方法适用于需要一次性处理大量相似性质的规则场景下。[^2] #### 解决新增规则未生效的问题 有时即使已经正确设置了新的防火墙规则,仍然可能出现预期外的行为——即某些服务无法正常通信。这可能是由于以下几个原因造成的: - 存在优先级更高的现有规则覆盖了刚加入的新规则; - 应用了错误的操作模式(例如尝试修改的是标准用户权限下的策略而实际运行的应用是以管理员身份启动); - 对于企业环境中由组策略下发的安全设定未能及时更新同步到目标主机之上; 遇到这种情况建议逐一排查以上可能性,并确保所作更改确实作用到了正确的上下文中去。[^3]
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值