Как проверить, существует ли правило брандмауэра

У меня есть кнопка, которая однажды нажата, она добавит новое правило в брандмауэр. НО проблема в том, что на него можно нажимать много раз и добавлять много правил.

Как проверить, существует ли правило в брандмауэре? (или можно проверить правила?)

Вот мой код для добавления правила:

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);

3 ответа

    public static void RemoveFirewallRules(string RuleName = "BreakermindCom")
{
    try
    {
        Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
        INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
        var currentProfiles = fwPolicy2.CurrentProfileTypes;               

        // Lista rules
        List<INetFwRule> RuleList = new List<INetFwRule>();

        foreach (INetFwRule rule in fwPolicy2.Rules)
        {
            // Add rule to list
            //RuleList.Add(rule);
            // Console.WriteLine(rule.Name);
            if (rule.Name.IndexOf(RuleName) != -1)
            {
                // Now add the rule
                INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));                     
                firewallPolicy.Rules.Remove(rule.Name);
                Console.WriteLine(rule.Name + " has been deleted from Firewall Policy");
            }
        }
    }
    catch (Exception r)
    {
        Console.WriteLine("Error delete rule from firewall");
    }}

Работает...:}

Вы можете использовать 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);
    }

Для одного правила брандмауэра:

          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);

Однако, если вы уже знаете имя правила брандмауэра, вы также можете просто сделать это (не проверено, но без Where пункт):

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

Однако суть заключалась в том, чтобы показать синтаксис linq и гибкость возможности поиска с его помощью определенных имен, шаблонов и т. Д.

WindowsFirewallHelper класс. Доступен как пакет NuGet для VS. Я искал решение несколько дней и нашел это. Изменил свою жизнь ради очень важного проекта.

Вот код, чтобы делать то, что вы хотите:

Другие вопросы по тегам