Подтвердить что ты не робот

Проверка брандмауэров сторонних производителей на машине

Я работаю над проверкой брандмауэров. Следующий код довольно легко проверяет состояние брандмауэра Windows по умолчанию:

    INetFwMgr manager = GetFireWallManager();
    bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled;
    if (isFirewallEnabled == false)
    {
      Console.WriteLine("Firewall is not enabled.");
    }
    else
    {
      Consoe.WriteLine("Firewall is enabled.");
    }
    Console.ReadLine();

   private static INetFwMgr GetFireWallManager()
   {
     Type objectType = Type.GetTypeFromCLSID(new Guid(firewallGuid));
     return Activator.CreateInstance(objectType) as INetFwMgr;
   }

Затем возникает вопрос: как мне найти статус брандмауэра, отличного от Windows? Если брандмауэр правильно интегрирован, будет ли описанная выше проверка работать одинаково или есть лучший способ для этого? Я проверил это сообщение: С# Настройки центра безопасности Windows и этот пост: С# - Как включить chceck, если включен внешний брандмауэр?, но оба оказались относительно бесполезными.

Я изучал API WMI, но пока это довольно запутанно, и документация через MSDN не была слишком многообещающей. Я также пробовал общаться с SelectQuery, но до сих пор я не увенчался успехом. Может ли кто-нибудь помочь мне в новой отправной точке или где я мог бы найти лучшую документацию/инструкции относительно сторонних брандмауэров? ​​

EDIT: В настоящее время я изучаю далее WMI, в частности класс FirewallProduct, как было предложено постом.

ОБНОВЛЕНИЕ 2: Я тестировал следующий фрагмент:

  string wmiNameSpace = "SecurityCenter2";
  ManagementScope scope;
  scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", wmiNameSpace), null);
  scope.Connect();
  ObjectQuery query = new ObjectQuery("SELECT * FROM FirewallProduct");
  ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

Но выполнение этого приводит к следующей ошибке: Exception Invalid namespace и указывает на строку 39 (scope.Connect()). Я бы не удивился, если бы просто пропустил параметр или отформатировал что-то неправильно, я просто не знаю, что это такое.

ОБНОВЛЕНИЕ 3. Переключение с SecurityCenter2 на SecurityCenter по-прежнему дает ту же ошибку invalid namespace.

ОБНОВЛЕНИЕ 4. Я переместил консольное приложение в другое поле (win7, а не winserver08r2), и оно было должным образом отчитано как ожидалось. Так что это может быть проблема с виртуальной машиной, которую я сейчас тестировал. Следующий шаг - разобрать активный/неактивный статус

ОБНОВЛЕНИЕ 5. Он был протестирован на другом сервере Server08, и появляется такая же ошибка invalid namespace. Использование SecurityCenter вместо SecurityCenter2 не решает проблему. Существует ли какая-то базовая функция безопасности, используемая ОС Windows Server для предотвращения несанкционированного доступа к брандмауэрам или серверная ОС не поставляется с определенным набором функций WMI?

4b9b3361

Ответ 1

В соответствии с Microsoft В: Как работает Windows Центр безопасности обнаруживает сторонние продукты и их статус?

А: Центр безопасности Windows использует двухуровневый подход для обнаружения положение дел. Один уровень - ручной, а другой уровень - через Инструментарий управления Windows (WMI). В режиме ручного обнаружения, Центр безопасности Windows выполняет поиск ключей и файлов реестра, которые предоставляемые Microsoft независимыми производителями программного обеспечения. Эти ключи реестра и файлы позволяют Центру безопасности Windows определить статус независимого программного обеспечения. В режиме WMI производители программного обеспечения определяют их собственный статус продукта и сообщить о статусе в Windows Центр безопасности через поставщика WMI. В обоих режимах Windows Центр безопасности пытается определить, верно ли следующее:

  • Имеется антивирусная программа.
  • Антивирусные сигнатуры являются актуальными.
  • В антивирусных программах включено сканирование в режиме реального времени или сканирование при доступе.
  • Для брандмауэров Центр безопасности Windows определяет, установлен ли сторонний межсетевой экран, и брандмауэр включен или нет.

Таким образом, вы можете использовать WMI, чтобы определить, установлен ли сторонний брандмауэр, используя класс FirewallProduct, когда-то я написал статью об этом теме, которая объясняет, как получить эту информацию с помощью WMI.

Попробуйте этот образец С#, чтобы получить текущее имя и состояние брандмауэра сторонних производителей.

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {

        static void Main(string[] args)
        {
            try
            {
                //select the proper wmi namespace depending of the windows version
                string WMINameSpace = System.Environment.OSVersion.Version.Major > 5 ? "SecurityCenter2" : "SecurityCenter";

                ManagementScope Scope;
                Scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", WMINameSpace), null);

                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM FirewallProduct");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {

                    Console.WriteLine("{0,-35} {1,-40}","Firewall Name",WmiObject["displayName"]);                      
                    if (System.Environment.OSVersion.Version.Major < 6) //is XP ?
                    {
                    Console.WriteLine("{0,-35} {1,-40}","Enabled",WmiObject["enabled"]);    
                    }
                    else
                    {
                        Console.WriteLine("{0,-35} {1,-40}","State",WmiObject["productState"]); 
                    }   
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}