在C#中操作Windows防火墙需要借助系统提供的COM组件NetFwTypeLib,该组件封装了防火墙的所有管理接口,通过调用这些接口可以实现规则的增删改查。操作前需要先添加对应的COM引用,再编写对应的逻辑代码。

环境准备
首先需要在项目中添加NetFwTypeLib的COM引用,步骤如下:
- 右键项目选择添加引用
- 切换到COM选项卡,找到
NetFwTypeLib,勾选后确认添加 - 添加完成后,项目中会生成对应的互操作程序集,就可以在代码中使用相关类型了
核心类型说明
操作防火墙规则主要用到以下几个核心类型:
| 类型名称 | 作用说明 |
|---|---|
| INetFwPolicy2 | 防火墙策略接口,用于获取当前防火墙的配置和规则集合 |
| INetFwRules | 防火墙规则集合接口,支持规则的添加、删除、查询操作 |
| INetFwRule | 单个防火墙规则接口,用于设置规则的名称、端口、协议、操作等属性 |
添加防火墙规则
添加规则需要创建INetFwRule实例,设置对应的属性后,将其添加到规则集合中。以下是一个开放TCP 8080端口的规则添加示例:
using System;
using NetFwTypeLib;
namespace FirewallDemo
{
class FirewallManager
{
/// <summary>
/// 添加入站防火墙规则
/// </summary>
/// <param name="ruleName">规则名称</param>
/// <param name="port">端口号</param>
/// <param name="protocol">协议,6表示TCP,17表示UDP</param>
public static void AddInboundRule(string ruleName, int port, int protocol)
{
// 创建防火墙规则实例
INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
// 设置规则名称
firewallRule.Name = ruleName;
// 设置规则描述
firewallRule.Description = $"允许{port}端口的入站连接";
// 设置协议类型
firewallRule.Protocol = (int)protocol;
// 设置本地端口
firewallRule.LocalPorts = port.ToString();
// 设置规则方向,1表示入站
firewallRule.Direction = 1;
// 设置操作,1表示允许
firewallRule.Action = 1;
// 设置规则启用
firewallRule.Enabled = true;
// 获取防火墙策略
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
// 将规则添加到防火墙规则集合
firewallPolicy.Rules.Add(firewallRule);
Console.WriteLine("防火墙规则添加成功");
}
}
}
删除防火墙规则
删除规则只需要知道规则的名称,通过规则集合的Remove方法即可删除对应的规则:
using System;
using NetFwTypeLib;
namespace FirewallDemo
{
class FirewallManager
{
/// <summary>
/// 根据规则名称删除防火墙规则
/// </summary>
/// <param name="ruleName">要删除的规则名称</param>
public static void RemoveRule(string ruleName)
{
try
{
// 获取防火墙策略
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
// 根据名称删除规则
firewallPolicy.Rules.Remove(ruleName);
Console.WriteLine("防火墙规则删除成功");
}
catch (Exception ex)
{
Console.WriteLine($"删除规则失败:{ex.Message}");
}
}
}
}
查询防火墙规则
可以通过遍历规则集合查询所有已存在的规则,也可以根据名称筛选特定规则:
using System;
using NetFwTypeLib;
namespace FirewallDemo
{
class FirewallManager
{
/// <summary>
/// 查询所有防火墙规则
/// </summary>
public static void QueryAllRules()
{
// 获取防火墙策略
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
// 遍历所有规则
foreach (INetFwRule rule in firewallPolicy.Rules)
{
Console.WriteLine($"规则名称:{rule.Name}");
Console.WriteLine($"规则描述:{rule.Description}");
Console.WriteLine($"本地端口:{rule.LocalPorts}");
Console.WriteLine($"协议:{rule.Protocol}");
Console.WriteLine($"是否启用:{rule.Enabled}");
Console.WriteLine("------------------------");
}
}
/// <summary>
/// 根据规则名称查询特定规则
/// </summary>
/// <param name="ruleName">规则名称</param>
public static void QueryRuleByName(string ruleName)
{
try
{
// 获取防火墙策略
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
// 根据名称获取规则
INetFwRule rule = firewallPolicy.Rules.Item(ruleName);
if (rule != null)
{
Console.WriteLine($"规则名称:{rule.Name}");
Console.WriteLine($"规则描述:{rule.Description}");
Console.WriteLine($"本地端口:{rule.LocalPorts}");
Console.WriteLine($"协议:{rule.Protocol}");
Console.WriteLine($"是否启用:{rule.Enabled}");
}
else
{
Console.WriteLine("未找到对应规则");
}
}
catch (Exception ex)
{
Console.WriteLine($"查询规则失败:{ex.Message}");
}
}
}
}
注意事项
- 操作Windows防火墙需要管理员权限,程序运行时需要以管理员身份启动,否则会抛出权限不足的异常
- 规则名称不能重复,添加规则前可以先查询是否存在同名规则,避免添加失败
- 协议类型中,6代表TCP协议,17代表UDP协议,设置时需要注意对应数值
- 规则方向中,1代表入站规则,2代表出站规则,根据实际需求设置
C#Windows防火墙防火墙规则NetFwTypeLib修改时间:2026-07-20 16:21:38