Проверьте наличие сторонних брандмауэров на машине

Я работаю над проверкой брандмауэров. Следующий код довольно легко проверяет состояние брандмауэра 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? Если брандмауэр правильно интегрирован, будет ли описанная выше проверка работать точно так же или есть лучший способ сделать это? Я проверил этот пост: Настройки Центра безопасности C# Windows и этот пост: C# - Как проверить, включен ли внешний брандмауэр? но оба оказались относительно бесполезными.

Я изучал 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?


person wjhguitarman    schedule 28.11.2012    source источник
comment
Вы можете изучить эту страницу codeproject.com. /Articles/37714/ Три справочные ссылки внизу также указывают на некоторые полезные страницы.   -  person Gary    schedule 29.11.2012
comment
Пространство имен SecurityCenter2 предназначено для Windows Vista, 7 и 8, для XP необходимо использовать пространство имен SecurityCenter.   -  person RRUZ    schedule 29.11.2012
comment
@wjhguitarman - Зачем вам нужно определять, установлен ли брандмауэр?   -  person Security Hound    schedule 29.11.2012
comment
@Ramhound Это часть анализатора работоспособности, который проверяет настройки и статистику на клиентском ящике. Для нашего программного обеспечения должно быть включено хотя бы одно исключение, поэтому сообщение о том, какой тип брандмауэра активен, может быть полезным.   -  person wjhguitarman    schedule 29.11.2012


Ответы (1)


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

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

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

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

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

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();
        }
    }
}
person RRUZ    schedule 29.11.2012
comment
Вау, вы, кажется, знаете свое дело! Я нахожусь в процессе тестирования вашего примера, но в интересах не просто копирования и вставки у меня есть вопрос, что такое {0,-35} {1,-40} в Console.WriteLineи какова его цель? - person wjhguitarman; 29.11.2012
comment
@wjhguitarman это просто параметры форматирования, чтобы они хорошо отображались. - person Daniel A. White; 29.11.2012
comment
Я прочитал больше по вашей ссылке в блоге, которую вы разместили, и я должен был сделать это намного раньше, все это время я пытался заставить его работать на сервере 2008, не зная, что это только для настольных версий :( - person wjhguitarman; 30.11.2012