2015-04-27 2 views
0

Je suis en train de programmer un windows-firewallmanager pour une entreprise.
Le problème est, que je ne peux supprimer une entrée par nom et pas par un objet INetFwRule ou quelque chose.
Il y a des entrées, qui ont le même nom deux fois où l'un est pour TCP et l'autre pour UDP et nous pourrions vouloir supprimer seulement l'un d'entre eux.
Je pourrais supprimer les deux et en créer un par la suite, mais je ne voudrais pas utiliser cette solution de contournement.
Est-ce que quelqu'un a une solution facile à cela?C# Pare-feu, supprimer une entrée spécifique

+0

Pouvez-vous filtrer par nom + Protocole? – Marco

+0

Oui, je peux boucler toutes les règles et filtrer pendant que – besplash

Répondre

2

Vous ne pouvez supprimer des règles que par l'intermédiaire de l'interface INetFwRules qui semble être une API mal conçue car des règles différentes peuvent avoir le même nom. Une solution de contournement consiste à filtrer les règles non seulement par nom, mais également par les autres propriétés qui spécifient la règle que vous souhaitez supprimer. Lorsque vous avez trouvé la règle à supprimer, vous pouvez renommer la règle en un nom unique à l'aide de l'interface INetFwRule.

Vous pouvez ensuite supprimer la règle en utilisant ce nom temporaire unique.

+0

J'ai déjà pensé à cela aussi, mais ce n'est pas une bonne programmation. Cependant, cela fonctionnerait bien. – besplash

+0

@besplash: Je crois que c'est votre seule option - appropriée ou programmation non appropriée. À mon avis, l'interface d'automatisation est mal conçue, mais vous ne pouvez rien y faire. –

+0

J'ai utilisé cette méthode maintenant. – besplash

-1
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"); 
    }} 

Regardez ce

+0

ne résout pas le problème des noms en double concernant la question – BerndK