В продолжение поста Настройка брандмауэра Windows 7 с помощью C# (Часть №1) реализуем возможность получения списка правил брандмауэра.
Доступ к свойствам правила брандмауэра обеспечивает интерфейс INetFwRule.Чтобы получить сам список правил нужно использовать свойство Rules объекта INetFwPolicy2.
Для работы с правилами я создам класс-обёртку, который просто будет повторять свойства из интерфейса INetFwRule. Но сначала разберемся со всеми свойствами по порядку:
Доступ к свойствам правила брандмауэра обеспечивает интерфейс 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; } }
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, указывающее профили, к которым относится правило. Для данного свойства я создал следующее перечисление и два метода расщирения для ковертации значений:
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:
Здесь мы просто получаем список правил, проходим в цикле и для каждого правила создаем класс-обёртку.
Исходный код
Спасибо большое!! главное, что все понятно! очень пригодилось)
ОтветитьУдалить