Как я могу определить, включен ли продукт брандмауэра?

Как я могу определить (из приложения Windows Forms, написанного на C#), включен ли продукт брандмауэра?

Вот мой код, и я получаю сообщение об ошибке на INetFwMgr, что тип или пространство имен не может быть найден

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; 

       INetFwMgr manager = GetFireWallManager();
       bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled;



       private static INetFwMgr GetFireWallManager()
       {
           Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER));
           return Activator.CreateInstance(objectType) as INetFwMgr;
       }
        private void button1_Click(object sender, EventArgs e)
        {



            if (isFirewallEnabled == false)
           {
                MessageBox.Show("Firewall is not enabled.");
           }
           else
           {
                MessageBox.Show("Firewall is enabled.");
           }

        }
    }
}

6 ответов

Я знаю, что это старый пост, но я нашел отличное решение!
Прочтите раздел реестра состояния брандмауэра, который находится в:

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ SharedAccess \ Параметры \FirewallPolicy\StandardProfile

Ключ: EnableFirewall

public static bool isFirewallEnabled() {
        try {
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile")) {
                if (key == null) {
                    return false;
                } else { 
                    Object o = key.GetValue("EnableFirewall");
                    if (o == null) {
                        return false;
                    } else {
                        int firewall = (int)o;
                        if (firewall == 1) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                }
            }
        } catch {
            return false;
        }
    }

Также вы можете получить значения для DomainProfile, PublicProfile и StandardProfile. Вы также можете получить FirewallRules.

Надеюсь, это поможет:)

NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); 
INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
bool Firewallenabled = mgr.LocalPolicy.CurrentProfile.FirewallEnabled;

Подробности смотрите по ссылке.

http://technet.microsoft.com/en-us/library/cc737845%28WS.10%29.aspx

http://blogs.msdn.com/b/securitytools/archive/2009/08/21/automating-windows-firewall-settings-with-c.aspx

Посмотрите на этот вопрос об антивирусе. Как обнаружить антивирус, установленный на Windows 2003 Server и 2008 Server 2003 Server R2 и 2008 Server R2, используя WMI или другой WMI в C++, тот же вызов API можно использовать для определения настроек брандмауэра с помощью WSC_SECURITY_PROVIDER_FIREWALL ENUM. Ответ на этот вопрос на самом деле неправильный, но он даст вам ответ для несерверных компьютеров. Этот код написан на C++, но вам нужен только вызов Windows API, вы также можете вызывать его из C#.

Просто импортируйте ссылки из C://windows/system32/hnetcfg.dll и C://windows/system32/FirewallAPI.dll

затем используйте

using NATUPNPLib;
using NETCONLib;
using NetFwTypeLib;

Сначала вам нужно добавить следующий компонент в ваш проект

  • INetFwMgr

Затем получите тип объекта из CLSID диспетчера конфигурации домашней сети, который {304CE942-6E39-40D8-943A-B913C40C9CD4}(Ссылки на C:\WINDOWS\system32\hnetcfg.dll и можно найти на HKEY_CLASSES_ROOT\CLSID\{304CE942-6E39-40D8-943A-B913C40C9CD4}) и использовать собранный тип для создания экземпляра с использованием конструктора по умолчанию типа в качестве нового INetFwMgr который будет использоваться для определения, включен ли межсетевой экран или нет INetFwMgr.LocalPolicy.CurrentProfile.FirewallEnabled который возвращает bool

private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; //This is the CLSID of Home Networking Configuration Manager. We'll use this to detect whether the Firewall is enabled or not
private static NetFwTypeLib.INetFwMgr GetHNCMType()
{
    Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER)); //Creates a new GUID from CLSID_FIREWALL_MANAGER getting its type as objectType
    return Activator.CreateInstance(objectType) as NetFwTypeLib.INetFwMgr; //Creates an instance from the object type we gathered as an INetFwMgr object
}
static void Main(string[] args)
{
    INetFwMgr manager = GetHNCMType(); //Initializes a new INetFwMgr of name manager from GetHNCMType
    if (manager.LocalPolicy.CurrentProfile.FirewallEnabled == false) //Continue if the firewall is not enabled
    {
        //The firewall is not enabled
        Console.WriteLine("OFF"); //Writes OFF to the Console in a new line
    }
    else //Otherwise:
    {
        //The fire wall is enabled
        Console.WriteLine("ON"); //Writes ON to the Console in a new line
    }
}

Спасибо,
Я надеюсь, что вы найдете это полезным:)


Чтобы добавить компонент в свой проект,

  • Щелкните правой кнопкой мыши Ссылки в обозревателе решений под названием проекта и выберите Добавить ссылку...
  • На вкладке COM выберите компонент, который вы хотите добавить, и нажмите OK

Вы можете использовать FwMgr для старых версий Windows (XP) и использовать брандмауэр Windows с API расширенной безопасности для Vista и выше.

Вот пример, который возвращает настройки брандмауэра.

Другие вопросы по тегам