четверг, 25 октября 2012 г.

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

В продолжение поста Настройка брандмауэра Windows 7 с помощью C# (Часть №1) реализуем возможность получения списка правил брандмауэра.
Доступ к свойствам правила брандмауэра обеспечивает интерфейс INetFwRule.Чтобы получить сам список правил нужно использовать свойство Rules объекта INetFwPolicy2.
Для работы с правилами я создам класс-обёртку, который просто будет повторять свойства из интерфейса  INetFwRule. Но сначала разберемся со всеми свойствами по порядку:

Action - значение типа NET_FW_ACTION, которое определяет действие для правила. Для данного свойства я создал следующее перечисление и два метода расщирения для ковертации значений:
    /// 
    /// The ActionEnum enumerated type specifies the action for a rule or default setting.
    /// 
    public enum ActionEnum
    {
        /// 
        /// Block traffic.
        /// 
        Block = 0,

        /// 
        /// Allow traffic.
        /// 
        Allow = 1,

        /// 
        /// Maximum traffic.
        /// 
        Max = 2 
    }

    public static NET_FW_ACTION_ ConvertTo(this ActionEnum actionEnum)
    {
        switch (actionEnum)
        {
            case ActionEnum.Allow:
                return NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
            case ActionEnum.Block:
                return NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
            default:
                return NET_FW_ACTION_.NET_FW_ACTION_MAX;
        }
    }

    public static ActionEnum ConvertFrom(this NET_FW_ACTION_ netFwAction)
    {
        switch (netFwAction)
        {
            case NET_FW_ACTION_.NET_FW_ACTION_ALLOW:
                return ActionEnum.Allow;
            case NET_FW_ACTION_.NET_FW_ACTION_BLOCK:
                return ActionEnum.Block;
            default:
                return ActionEnum.Max;
        }
    }

ApplicationName - строковое значение, которое определяет полный путь к исполняемому файлу.

Description - строковое значение, которое определяет описание правила. Строка не должна содержать символ "|".

Direction - значение типа NET_FW_RULE_DIRECTION, которое определяет направление трафика для правила.  Для данного свойства я создал следующее перечисление и два метода расщирения для ковертации значений:
    /// 
    /// The DirectionEnum enumerated type specifies the direction of traffic to which a rule applies.
    /// 
    public enum DirectionEnum
    {
        /// 
        /// The rule applies to inbound traffic.
        /// 
        In = 1,

        /// 
        /// The rule applies to outbound traffic.
        /// 
        Out = 2,

        /// 
        /// This value is used for boundary checking only and is not valid for application programming.
        /// 
        Max = 3
    }

    public static NET_FW_RULE_DIRECTION_ ConvertTo(this DirectionEnum direction)
    {
        switch (direction)
        {
            case DirectionEnum.In:
                return NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
            case DirectionEnum.Out:
                return NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
            default:
                return NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_MAX;
        }
    }

    public static DirectionEnum ConvertFrom(this NET_FW_RULE_DIRECTION_ netFwRuleDirection)
    {
        switch (netFwRuleDirection)
        {
            case NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN:
                return DirectionEnum.In;
            case NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT:
                return DirectionEnum.Out;
            default:
                return DirectionEnum.Max;
        }
    }

EdgeTraversal -  булево значение, которое определяет разрешен ли обход узлов. 

Enabled - булево значение, которое определяет включено или выключено правило.

Grouping - строковое значение, определяющее группу, к которой принадлежит правило.

IcmpTypesAndCodes - строковое значение, которое определяет список типов и кодов ICMP через точку с запятой. Символ "*" означает все ICMP типы и коды.

Interfaces - Определяет список интерфейсов, для которых применяется данное правило.

InterfaceTypes -  строковое значение, указывающее список типов интерфейсов, для которых применяется данное правило. Допустимые значения этого свойства: "RemoteAccess", "Wireless", "Lan", "All". Если указан более чем один тип интерфейса, строки должны быть разделены запятой.

LocalAddresses - строковое значение, содержащее список локальных адресов IPv4 и IPv6. Диапазон значений (список  IP-адресов разделенных запятыми без пробелов) и символ "*" являются приемлемыми в этом списке.

LocalPorts - строковое значение, содержащее список локальных номеров портов. Вы можете указать "*" для всех портов, или отдельный порт. "RPC" является приемлемым значением. Перед установкой номеров портов нужно установить протокол правила.

Name -  строковое значение, которое определяет имя правила. Строка не должна содержать "|" и не должна быть "all".

Profiles - значение типа long, указывающее профили, к которым относится правило.  Для данного свойства я создал следующее перечисление и два метода расщирения для ковертации значений:
    /// 
    /// The ProfileEnum enumerated type specifies the type of profile.
    /// 
    public enum ProfileType
    {
        /// 
        /// Profile type is domain.
        /// 
        Domain = 0x0001,

        /// 
        /// Profile type is private. This profile type is used for home and other private network types.
        /// 
        Private = 0x0002,

        /// 
        /// Profile type is public. This profile type is used for public Internet access points.
        /// 
        Public = 0x0004,

        /// 
        /// All profile types.
        /// 
        All = 0x7FFFFFFF 
    }

    public static NET_FW_PROFILE_TYPE2_ ConvertTo(this ProfileType profile)
    {
        switch (profile)
        {
            case ProfileType.Domain:
                return NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN;
            case ProfileType.Private:
                return NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE;
            case ProfileType.Public:
                return NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC;
            default:
                return NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_ALL;
        }
    }

    public static ProfileType ConvertFrom(this NET_FW_PROFILE_TYPE2_ netFwProfileType2)
    {
        switch (netFwProfileType2)
        {
            case NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN:
                return ProfileType.Domain;
            case NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE:
                return ProfileType.Private;
            case NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC:
                return ProfileType.Public;
            default:
                return ProfileType.All;
        }
    }

Protocol - значение, которое задает IP-протокол для правила. Актуальный список протоколов можно найти здесь.  Для данного свойства я создал следующее перечисление и два метода расщирения для ковертации значений:
    /// 
    /// The ProtocolEnum enumeration type specifies the Internet protocol.
    /// 
    public enum ProtocolEnum
    {
        /// 
        /// Transmission Control Protocol.
        /// 
        Tcp = 6,

        /// 
        /// User Datagram Protocol.
        /// 
        Udp = 17,

        /// 
        /// Any Protocol
        /// 
        Any = 256,
    }

    public static NET_FW_IP_PROTOCOL_ ConvertTo(this ProtocolEnum protocol)
    {
        switch (protocol)
        {
            case ProtocolEnum.Tcp:
                return NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
            case ProtocolEnum.Udp:
                return NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;
            default:
                return NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
        }
    }

    public static ProtocolEnum ConvertFrom(this NET_FW_IP_PROTOCOL_ netFwProfileType2)
    {
        switch (netFwProfileType2)
        {
            case NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP:
                return ProtocolEnum.Tcp;
            case NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP:
                return ProtocolEnum.Udp;
            default:
                return ProtocolEnum.Any;
        }
    }

RemoteAddresses -  строковое значение, содержащее список удаленных адресов IPv4 и IPv6. Диапазон значений (список  IP-адресов разделенных запятыми без пробелов) и символ "*" являются приемлемыми в этом списке.

RemotePorts - строковое значение, содержащее список удаленных номеров портов.

ServiceName -  строковое значение, которое указывает имя службы приложения.

Теперь, когда мы разобрались со свойствами, создадим метод, который будет нам возвращает список настроенных правил брандмауэра.
Code:
        /// <summary>
        /// Retrieves the collection of firewall rules.
        /// </summary>
        public IEnumerable<FirewallRule> GetRules()
        {
            if (netFwPolicy2 != null)
            {
                var enumerator = netFwPolicy2.Rules.GetEnumerator();
                enumerator.Reset();
                while (enumerator.MoveNext())
                {
                    var rule = enumerator.Current as INetFwRule;
                    if (rule != null)
                        yield return new FirewallRule
                        {
                            Action = rule.Action.ConvertFrom(),
                            ApplicationName = rule.ApplicationName,
                            Description = rule.Description,
                            Direction = rule.Direction.ConvertFrom(),
                            EdgeTraversal = rule.EdgeTraversal,
                            Enabled = rule.Enabled,
                            Grouping = rule.Grouping,
                            IcmpTypesAndCodes = rule.IcmpTypesAndCodes,
                            InterfaceTypes = rule.InterfaceTypes,
                            Interfaces = rule.Interfaces,
                            LocalAddresses = rule.LocalAddresses,
                            LocalPorts = rule.LocalPorts,
                            Name = rule.Name,
                            Profiles = ((NET_FW_PROFILE_TYPE2_)rule.Profiles).ConvertFrom(),
                            Protocol = ((NET_FW_IP_PROTOCOL_)rule.Protocol).ConvertFrom(),
                            RemoteAddresses = rule.RemoteAddresses,
                            RemotePorts = rule.RemotePorts,
                            ServiceName = rule.serviceName
                        };
                }
            }
        }

Здесь мы просто получаем список правил, проходим в цикле и для каждого правила создаем класс-обёртку.

Исходный код

1 комментарий:

  1. Спасибо большое!! главное, что все понятно! очень пригодилось)

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