Начиная с 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) нужно запустить с правами администратора, иначе исключения не избежать:


Комментариев нет:
Отправить комментарий