среда, 12 сентября 2012 г.

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

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


Комментариев нет:

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