Начиная с Windows Vista (для клиентской опреационной системы) и Windows Server 2008 (для серверной) для доступа к политикам брандмауэра Windows следует использовать интерфейс INetFwPolicy2, который находится в библиотеке FirewallAPI.dll.
Чтобы иметь возможность использовать данную функциональность в проекте C#, нужно подключить ссылку на сборку следующим образом:
После подключения библиотеки нам нужно создать экземпляр типа. Для этого воспользуемся классом Activator, который позволяет создавать типы объектов или получать ссылки на существующие удаленные объекты:
// Create INetFwPolicy2 instance INetFwPolicy2 netFwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
Получение и установка статуса брандмауэра
Для получения статуса брандмауэра следует использовать индексированное свойство FirewallEnabled, которое в качестве индекса принимает перечисление NET_FW_PROFILE_TYPE2. Так как я буду создавать отдельную сборку для работы с брандмауэром, я создам свое перечисление, которое в точности будет повторять NET_FW_PROFILE_TYPE2 и метод расширения для конвертации значений:
Теперь создаим методы для получения и установки статус указанной сети:
/// public enum ProfileType { /// Domain = 0x0001, /// Private = 0x0002, /// Public = 0x0004, /// 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; } }
Теперь создаим методы для получения и установки статус указанной сети:
/// /// ProfileEnum value. ///True if the firewall is enabled. public Boolean GetFirewallStatus(ProfileType profile) { var profileType = profile.ConvertTo(); return netFwPolicy2.FirewallEnabled[profileType]; } /// /// ProfileEnum value. /// Firewall status. ///True if the firewall is enabled. public Boolean SetFirewallStatus(ProfileType profile, Boolean status) { var profileType = profile.ConvertTo(); netFwPolicy2.FirewallEnabled[profileType] = status; return GetFirewallStatus(profile); }
Проведем тестирования наших методов:
static void Main(string[] args) { Console.WriteLine("Get firewall status"); Console.WriteLine(String.Format("{0} - {1}", ProfileType.Domain, FirewallManager.Instance.GetFirewallStatus(ProfileType.Domain))); Console.WriteLine(String.Format("{0} - {1}", ProfileType.Private, FirewallManager.Instance.GetFirewallStatus(ProfileType.Private))); Console.WriteLine(String.Format("{0} - {1}", ProfileType.Public, FirewallManager.Instance.GetFirewallStatus(ProfileType.Public))); Console.WriteLine(String.Format("Set {0} to {1}", ProfileType.Public, FirewallManager.Instance.SetFirewallStatus(ProfileType.Public, false))); Console.WriteLine("Get firewall status"); Console.WriteLine(String.Format("{0} - {1}", ProfileType.Domain, FirewallManager.Instance.GetFirewallStatus(ProfileType.Domain))); Console.WriteLine(String.Format("{0} - {1}", ProfileType.Private, FirewallManager.Instance.GetFirewallStatus(ProfileType.Private))); Console.WriteLine(String.Format("{0} - {1}", ProfileType.Public, FirewallManager.Instance.GetFirewallStatus(ProfileType.Public))); }
Результатом будет следующее:
Чтобы данный код работал, приложение (или Visual Studio) нужно запустить с правами администратора, иначе исключения не избежать:
Комментариев нет:
Отправить комментарий