C# 如何检查防火墙规则是否存在

C# 如何检查防火墙规则是否存在,c#,windows-firewall,C#,Windows Firewall,我有一个按钮,一旦点击,它将添加一个新的规则到防火墙。但问题是,它可以被多次单击,并将添加许多规则 如何检查防火墙中是否存在该规则?(或者是否可以检查规则?) 以下是我添加规则的代码: ProcessStartInfo run = new ProcessStartInfo(); run.FileName = "cmd.exe"; run.Verb = "runas"; run.Arguments = "/C netsh advfirewall firewall add rule name=\"B

我有一个按钮,一旦点击,它将添加一个新的规则到防火墙。但问题是,它可以被多次单击,并将添加许多规则

如何检查防火墙中是否存在该规则?(或者是否可以检查规则?)

以下是我添加规则的代码:

ProcessStartInfo run = new ProcessStartInfo();
run.FileName = "cmd.exe";
run.Verb = "runas";
run.Arguments = "/C netsh advfirewall firewall add rule name=\"Block IP Rule\" dir=in interface=any action=block remoteip=x.x.x.x";
run.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(run);
publicstaticvoidremoveFirewallRules(stringruleName=“BreakermindCom”)
{
尝试
{
类型tNetFwPolicy2=Type.GetTypeFromProgID(“HNetCfg.FwPolicy2”);
INetFwPolicy2-fwPolicy2=(INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
var currentProfiles=fwPolicy2.CurrentProfileTypes;
//利斯塔规则
列表规则列表=新列表();
foreach(fwPolicy2.Rules中的INetFwRule规则)
{
//将规则添加到列表中
//规则列表。添加(规则);
//Console.WriteLine(规则名称);
if(rule.Name.IndexOf(RuleName)!=-1)
{
//现在添加规则
INetFwPolicy2防火墙策略=(INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwPolicy2”);
firewallPolicy.Rules.Remove(rule.Name);
Console.WriteLine(rule.Name+“已从防火墙策略中删除”);
}
}
}
捕获(异常r)
{
Console.WriteLine(“从防火墙删除规则时出错”);
}}

作品…:}

WindowsFirewallHelper类。作为适用于VS的NuGet软件包提供。 我找了好几天的解决办法,发现了这个。为了一个非常重要的项目改变了我的生活

以下是执行所需操作的代码:

private void initFWrule(对象发送方,事件参数e)
{
Console.WriteLine(“检查防火墙规则是否存在”);
var myRule=FirewallManager.Instance.Rules.SingleOrDefault(r=>r.Name==“BlockUTG_Port-26881”);
//将您的规则名称替换为上述BlockUTG_Port-26881
尝试
{
if(myRule!=null)
{
Console.WriteLine(“规则确实存在”);
}
其他的
{
Console.WriteLine(“规则不存在”);
//在此处运行代码以创建规则
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);

}
在将防火墙规则初始化为选择性/特定时,可以使用linq

对于具有相同名称的多个防火墙规则:

    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); 
    List<INetFwRule> firewallRules = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name.Contains(fwRuleName)).ToList();

    foreach (INetFwRule rule in firewallRules)
    {
        firewallPolicy.Rules.Remove(rule.Name);
    }

不过,重点是展示linq语法以及能够使用它搜索特定名称、模式等的灵活性。

尝试删除现有规则并再次添加:),考虑simpleThanks,尽管我尝试了Oli最简单的想法,在我的情况下效果更好。下面是mysql数据库禁止和允许ip地址的示例
    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); 
    List<INetFwRule> firewallRules = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name.Contains(fwRuleName)).ToList();

    foreach (INetFwRule rule in firewallRules)
    {
        firewallPolicy.Rules.Remove(rule.Name);
    }
    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
    INetFwRule firewallRule = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name == fwRuleName).FirstOrDefault();
    firewallPolicy.Rules.Remove(firewallRule.Name);
    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
    firewallPolicy.Rules.Remove(fwRuleName);