C# 使用API更新现有防火墙规则

C# 使用API更新现有防火墙规则,c#,api,windows-firewall,C#,Api,Windows Firewall,我可以按语法将单个规则添加到Windows防火墙(Server 2008 R2),但是我试图避免每个IP地址都有多个规则,只想更新现有的规则RemoteAddresses。下面是我用来添加规则的代码,我正在尽全力研究如何更新现有的规则远程地址,但运气不好 感谢您的帮助 string ip = "x.x.x.x"; INetFwRule2 firewallRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HN

我可以按语法将单个规则添加到Windows防火墙(Server 2008 R2),但是我试图避免每个IP地址都有多个规则,只想更新现有的规则RemoteAddresses。下面是我用来添加规则的代码,我正在尽全力研究如何更新现有的规则远程地址,但运气不好

感谢您的帮助

string ip = "x.x.x.x";

INetFwRule2 firewallRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));

firewallRule.Name = "Block Bad IP Addresses";
firewallRule.Description = "Block Nasty Incoming Connections from IP Address.";
firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
firewallRule.Enabled = true;
firewallRule.InterfaceTypes = "All";
firewallRule.RemoteAddresses = ip;

INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(firewallRule);

以下代码适用于我:

INetFwPolicy2 firewallPolicy = (INetFwPolicy2) Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));

var rule = firewallPolicy.Rules.Item("Block Bad IP Addresses"); // Name of your rule here
rule.Name = "Block Block Block"; // Update the rule here. Nothing else needed to persist the changes

除了amdmax的回答(抱歉,我无法添加注释)之外,我发现没有简单的方法调用来检查规则是否存在,因此我提出了这个方法,以确保无论规则是否存在,都会创建规则:

  INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(
      Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));

  INetFwRule firewallRule = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name == RULE_NAME).FirstOrDefault();

  if (firewallRule == null)
  {
    firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
    firewallRule.Name = RULE_NAME;
    firewallPolicy.Rules.Add(firewallRule);
  }
INetFwPolicy2 firewallPolicy=(INetFwPolicy2)Activator.CreateInstance(
Type.GetTypeFromProgID(“HNetCfg.FwPolicy2”);
INetFwRule firewallRule=firewallPolicy.Rules.OfType(),其中(x=>x.Name==RULE_Name).FirstOrDefault();
if(firewallRule==null)
{
firewallRule=(INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FWRule”);
firewallRule.Name=规则\u名称;
firewallPolicy.Rules.Add(firewallRule);
}

我发现这个软件包可以通过nuget获得

范例

var rule=FirewallManager.Instance.Rules.Where(o=>
o、 方向==防火墙方向。入站&&
o、 Name.Equals(“允许远程桌面”)
).FirstOrDefault();
如果(规则!=null)
{
//更新现有规则
rule.RemoteAddresses=新地址[]
{
SingleIP.Parse(“192.168.184.1”),
SingleIP.Parse(“192.168.184.2”)
};
返回;
}
//创建新规则
规则=FirewallManager.Instance.CreateApplicationRule(
FirewallManager.Instance.GetProfile().Type,
@“允许远程桌面”,
防火墙。允许,
无效的
);
rule.Direction=FirewallDirection.Inbound;
rule.localport=new-ushort[]{3389};
rule.Action=FirewallAction.Allow;
rule.Protocol=FirewallProtocol.TCP;
rule.Scope=FirewallScope.All;
rule.Profiles=FirewallProfiles.Public | FirewallProfiles.Private;
rule.RemoteAddresses=new-IAddress[]{SingleIP.Parse(“192.168.184.1”)};
FirewallManager.Instance.Rules.Add(rule);

请避免在您的问题前面加上C#或类似的前缀,这就是标记的用途。是否有任何方法可以解除阻止被阻止的IP,我的意思是更新规则您可以更改规则。RemoteAddresses(逗号分隔)提示测试此代码的人:更改将按说明进行保存,但在刷新显示之前,可能不会显示在具有高级安全性的Windows防火墙应用程序中。这将使用
NetFwTypeLib
COM库如果有多个同名规则怎么办?Windows似乎自动为我的应用程序创建了两个(一个用于UDP,一个用于TCP)。
PM> install-package WindowsFirewallHelper