通过win7 FirewallAPI将应用程序防火墙规则添加到专用和公用网络

一点背景:Basicaly我想为私人和公共网络添加程序防火墙访问规则。

我曾经使用过这个 – “netsh firewall add allowedprogram program =”Path ..“name = AppName ENABLE scope = ALL profile = CURRENT”

但是现在我想使用COM对象自动化一些进程。 找到了这段shiny的代码 – http://web.archive.org/web/20070707110141/http://www.dot.net.nz/Default.aspx?tabid=42&mid=404&ctl=Details&ItemID=8

在实施课程后,我一直在尝试使用FirewallHelper.Instance.GrantAuthorization(@“Path …”,“AppName”,NET_FW_SCOPE_.NET_FW_SCOPE_ALL,NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY);

我面临的问题是GrantAuthorization方法只会为公共或专用网络添加规则,而我的旧netsh命令会为每个网络添加2个规则。

这些命令实际上看起来非常相似,所以它对我来说有点温和。

那么……如何添加两个网络规则?

肖恩

我的答案来自大卫的答案,但更详细。 并修复有关设置Localports的问题。 您需要在设置Localports之前设置Protocol。 更多细节如下:

首先,您需要导入参考FirewallAPI.dll。 它在“C:\ Windows \ System32 \ FirewallAPI.dll”中,然后:

using NetFwTypeLib; 

并将代码插入到您的:

  Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2"); INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2); var currentProfiles = fwPolicy2.CurrentProfileTypes; // Let's create a new rule INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule")); inboundRule.Enabled = true; //Allow through firewall inboundRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW; //Using protocol TCP inboundRule.Protocol = 6; // TCP //Port 81 inboundRule.LocalPorts = "81"; //Name of rule inboundRule.Name = "MyRule"; // ...// inboundRule.Profiles = currentProfiles; // Now add the rule INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); firewallPolicy.Rules.Add(inboundRule); 

我认为您最好的选择是使用高级安全API与Windows防火墙进行通信 。

快速谷歌“C#INetFwRule2”将向您展示如何注册或更新防火墙规则的大量示例。

为了增加公共和私人政策,我已经使用了一些东西

 Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2"); INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2); var currentProfiles = fwPolicy2.CurrentProfileTypes; // Let's create a new rule INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule")); inboundRule.Enabled = true; inboundRule.LocalPorts = "1234"; inboundRule.Protocol = 6; // TCP // ... inboundRule.Profiles = currentProfiles; // Now add the rule INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); firewallPolicy.Rules.Add(inboundRule); 

万一你们想要出境规则:

 inboundRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;