воскресенье, 23 декабря 2012 г.

Настройка брандмауэра Windows 7 с помощью C# (Часть №3)

В продолжение поста Настройка брандмауэра Windows 7 с помощью C# (Часть №2) реализуем возможность создания нового правила для брандмауэра и удаления.
Чтобы создать новое правило  для брандмауэра  нужно добавить его к коллекции Rules объекта INetFwPolicy2.
Так как в предыдущих постах данной серии я уже создал класс-обёртку для правила, то  ниже  просто приведу код, для создания нового правила.


Code:
        /// <summary>
        /// Create new rule in the collection.
        /// </summary>
        /// <param name="firewallRule">Firewall rule.</param>
        public void CreateRule(FirewallRule firewallRule)
        {
            try
            {
                if (firewallRule == null) throw new ArgumentNullException("firewallRule");
                // Create INetFwRule instance
                var fwRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
                // Set properties
                if (String.IsNullOrEmpty(firewallRule.Name.Trim())) throw new ArgumentException("Name");
                fwRule.Name = firewallRule.Name;
                if (!String.IsNullOrEmpty(firewallRule.ApplicationName)) fwRule.ApplicationName = firewallRule.ApplicationName;
                fwRule.Description = firewallRule.Description;
                fwRule.Grouping = firewallRule.Grouping;
                fwRule.Protocol = (int)firewallRule.Protocol.ConvertTo();
                fwRule.Direction = firewallRule.Direction.ConvertTo();
                fwRule.Enabled = firewallRule.Enabled;
                fwRule.EdgeTraversal = firewallRule.EdgeTraversal;
                if (firewallRule.Protocol != ProtocolEnum.Any)
                {
                    if (!String.IsNullOrEmpty(firewallRule.LocalPorts)) fwRule.LocalPorts = firewallRule.LocalPorts;
                    if (!String.IsNullOrEmpty(firewallRule.RemotePorts)) fwRule.RemotePorts = firewallRule.RemotePorts;
                }
                if (firewallRule.Protocol == ProtocolEnum.Icmp)
                {
                    if (!String.IsNullOrEmpty(firewallRule.IcmpTypesAndCodes)) fwRule.IcmpTypesAndCodes = firewallRule.IcmpTypesAndCodes;
                }
                if (!String.IsNullOrEmpty(firewallRule.LocalAddresses)) fwRule.LocalAddresses = firewallRule.LocalAddresses;
                if (!String.IsNullOrEmpty(firewallRule.RemoteAddresses)) fwRule.RemoteAddresses = firewallRule.RemoteAddresses;
                if (!String.IsNullOrEmpty(firewallRule.InterfaceTypes)) fwRule.InterfaceTypes = firewallRule.InterfaceTypes;
                fwRule.Profiles = (Int32)firewallRule.Profiles;
                fwRule.Action = firewallRule.Action.ConvertTo();
                fwRule.serviceName = firewallRule.ServiceName;
                // Add rule
                netFwPolicy2.Rules.Add(fwRule);
            }
            catch (Exception ex)
            {
                throw;
            }
        }

При создании правила следует соблюдать все форматы значений свойств, а также порядок установки этих значений, которые я описал в предыдущем посте.
Для удаления правил я сделал два обычных метода:

Code:
        /// <summary>
        /// Removes a specified rule from the collection.
        /// </summary>
        /// <param name="firewallRule">Firewall rule.</param>
        public void RemoveRule(FirewallRule firewallRule)
        {
            try
            {
                if (firewallRule == null) throw new ArgumentNullException("firewallRule");
                RemoveRule(firewallRule.Name);
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        /// <summary>
        /// Removes a specified rule from the collection.
        /// </summary>
        /// <param name="name">Name of rule.</param>
        public void RemoveRule(String name)
        {
            try
            {
                if (name == null) throw new ArgumentNullException("name");
                // Remove rule
                netFwPolicy2.Rules.Remove(name);
            }
            catch (Exception ex)
            {
                throw;
            }
        }

Пример создания нового правила приведен ниже:

Code:
    var rule = new FirewallRule
                    {
                        ApplicationName = Assembly.GetExecutingAssembly().Location,
                        Name = "FirewallSecurityConsole",
                        Action = ActionEnum.Block,
                        Description = "Firewall Security Console rule",
                        Profiles = ProfileType.All,
                        Protocol = ProtocolEnum.Tcp,
                        Direction = DirectionEnum.In,
                        Enabled = true
                    };
    FirewallManager.Instance.CreateRule(rule);

Исходный код

2 комментария:

  1. Великолепно!
    Большое спасибо, очень помогло отбивать попытки подбора пароля по RDP.
    Ник

    ОтветитьУдалить
  2. Спасибо большое! Всё прекрасно работает. Очень полезная вещь

    ОтветитьУдалить