在C#中调用Windows防火墙界面的常见方式
作者:降薪码农
在 C# 中调用 Windows 防火墙界面(基础设置或高级安全设置),可以使用 进程启动(Process.Start) 或 Win32 API 来实现,所以本文给大家介绍了C#调用Windows防火墙界面的常见方式,需要的朋友可以参考下
引言
在 C# 中调用 Windows 防火墙界面(基础设置或高级安全设置),可以使用 进程启动(Process.Start) 或 Win32 API 来实现。以下是几种常见方式:
1. 直接启动防火墙界面
(1) 打开基本防火墙设置(firewall.cpl)
using System.Diagnostics;
Process.Start("firewall.cpl"); // 直接调用控制面板防火墙界面
(2) 打开高级防火墙设置(wf.msc)
Process.Start("wf.msc"); // 直接打开防火墙高级安全设置
2. 以管理员权限运行
由于防火墙设置通常需要 管理员权限,可以使用 ProcessStartInfo 提权运行:
using System.Diagnostics;
var startInfo = new ProcessStartInfo
{
FileName = "wf.msc", // 或者 "firewall.cpl"
UseShellExecute = true,
Verb = "runas" // 请求管理员权限
};
try
{
Process.Start(startInfo);
}
catch (Exception ex)
{
Console.WriteLine($"未能启动:{ex.Message}");
}
3. 调用控制面板的方式
如果希望 更加严格地调用系统控制面板,可以使用:
Process.Start("control.exe", "/name Microsoft.WindowsFirewall");
说明:Windows 11 可能使用新的设置界面,该方法适用于 Windows 10 及更早版本。
4. 使用 COM+ 控制防火墙(高级)
如果你希望在 C# 中动态管理防火墙规则(而不只是打开界面),可以使用 INetFwPolicy2:
using System.Runtime.InteropServices;
public class FirewallHelper
{
[DllImport("ole32.dll")]
private static extern int CoCreateInstance(
[In] ref Guid rclsid,
IntPtr pUnkOuter,
uint dwClsContext,
[In] ref Guid riid,
out INetFwPolicy2 firewallPolicy);
[Guid("98325047-C671-4174-8D81-DEFCD3F03186"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
private interface INetFwPolicy2
{
int CurrentProfileTypes { get; }
bool FirewallEnabled { [return: MarshalAs(UnmanagedType.VariantBool)] get; }
// ... 其他方法
}
public static bool IsFirewallEnabled()
{
var guid = new Guid("E2B3C97F-6AE1-41AC-817A-F6F92166D7DD");
var riid = new Guid("98325047-C671-4174-8D81-DEFCD3F03186");
CoCreateInstance(ref guid, IntPtr.Zero, 1, ref riid, out INetFwPolicy2 policy);
return policy.FirewallEnabled;
}
}
注意:
- INetFwPolicy2 需要 管理员权限 才能调用。
- 这种方法可以 读取防火墙状态、添加/删除规则,但不能 直接打开 GUI。
5. 使用 Windows API 更深入地操控
如果要 精确控制规则(如放行端口/程序),可使用:
using NetFwTypeLib; // 需引用 COM "Windows Firewall Admin Type Library"
public static void AddFirewallRule()
{
Type fwPolicyType = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
INetFwPolicy2 fwPolicy = (INetFwPolicy2)Activator.CreateInstance(fwPolicyType);
INetFwRule rule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
rule.Name = "My Custom Rule";
rule.Description = "Allow Port 8080";
rule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
rule.LocalPorts = "8080";
rule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
rule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
rule.Enabled = true;
fwPolicy.Rules.Add(rule);
}
需要 管理员权限 且 引用 COM NetFwTypeLib(Windows Firewall Admin Type Library)。
总结
| 需求 | 方法 | 是否需要管理员权限? |
|---|---|---|
| 打开 普通防火墙界面 | Process.Start("firewall.cpl") | ❌ 不需要 |
| 打开 高级安全防火墙 | Process.Start("wf.msc") | ❌ 不需要 |
| 提权运行(确保打开成功) | ProcessStartInfo + Verb="runas" | ✅ 需要 |
| 查看/修改防火墙规则 | INetFwPolicy2(COM) | ✅ 需要 |
| 动态管理防火墙规则 | NetFwTypeLib(COM 库) | ✅ 需要 |
如果你的目标是 简单地打开防火墙界面,方法 1 或 2 就足够了。
如果需要 编程方式管理规则,才需要 COM(方法 4/5)。
以上就是在C#中调用Windows防火墙界面的常见方式的详细内容,更多关于C#调用Windows防火墙界面的资料请关注脚本之家其它相关文章!
