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

时间:2013-03-14 12:50:42

标签: c# firewall windows-firewall windows-firewall-api firewall-access

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

我以前用过 - “netsh firewall add allowedprogram program =”Path ..“name = AppName ENABLE scope = ALL profile = CURRENT”

但是现在我想使用COM对象自动化一些进程。 找到了这段闪亮的代码 - 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命令会为每个网络添加1个规则。

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

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

肖恩

4 个答案:

答案 0 :(得分:11)

我的回答来自大卫的回答,但更详细。并修复有关设置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);

答案 1 :(得分:7)

我认为你最好的选择是与Windows Firewall with Advanced Security API交谈。

快速谷歌“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);

答案 2 :(得分:2)

以防你们想要出站规则:

inboundRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;

答案 3 :(得分:1)

此页面未说明此问题已被回答并且已过时,因此,以防万一,以备将来使用,我将为您解答。

首先,导入位于“ C:\ Windows \ System32 \ FirewallAPI.dll”的参考FirewallAPI.dll,然后添加using指令

using NetFwTypeLib;

inboundRule.Profiles属性似乎被归类为带有以下值的标志集(该属性的类型是int,所以我做了一个枚举):

public enum FirewallProfiles
{
    Domain = 1,
    Private = 2,
    Public = 4
}

因此,使用该代码,我们可以将个人档案更改为以下内容:

// Create a new rule
INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwRule"));
// Enable the rule
inboundRule.Enabled = true;
// Allow through firewall
inboundRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
// Using protocol TCP
inboundRule.Protocol = 6; // TCP
// Set port number
inboundRule.LocalPorts = "1234";
// Name of rule
inboundRule.Name = "Name Of Firewall Rule";
// Set profiles
inboundRule.Profiles = (int)(FirewallProfiles.Private | FirewallProfiles.Public);

// Add the rule
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(inboundRule);

或者您可以将inboundRule.Profiles更改为int值。

两个注意事项:

1:如果您不以管理员权限运行此代码,

firewallPolicty.Rules.Add(inboundRule);

将引发异常。

2:inboundRule.Profiles必须介于1到7之间。否则,它将引发异常