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

Обнаружение антивируса в Windows с помощью С#

Есть ли способ определить, существует ли антивирусное программное обеспечение, установленное на машине с помощью С#? Я знаю, что Центр безопасности обнаруживает антивирусное программное обеспечение, но как вы можете обнаружить это на С#?

4b9b3361

Ответ 1

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

Имеется антивирусная программа.

Антивирусные сигнатуры являются актуальными.

В антивирусных программах включено сканирование в режиме реального времени или сканирование при доступе.

Для брандмауэров Центр безопасности Windows обнаруживает, установлен ли сторонний брандмауэр и включен ли брандмауэр.

Итак, чтобы определить наличие антивирусного программного обеспечения, вы можете использовать WMI, соединяющий пространство имен root\SecurityCenter (начиная с Windows Vista вы должны использовать пространство имен root\SecurityCenter2), а затем запросить для AntiVirusProduct класс WMI.

Посмотрите на этот пример кода

using System;
using System.Text;
using System.Management;

namespace ConsoleApplication1
{
  class Program
  {
    public static bool AntivirusInstalled()
    {

      string wmipathstr = @"\\" + Environment.MachineName + @"\root\SecurityCenter";
      try
      {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmipathstr, "SELECT * FROM AntivirusProduct");
        ManagementObjectCollection instances = searcher.Get();
        return instances.Count > 0;
      }

      catch (Exception e)
      {
        Console.WriteLine(e.Message);
      }

      return false;
    } 

    public static void Main(string[] args)
    {
      bool returnCode = AntivirusInstalled();
      Console.WriteLine("Antivirus Installed " + returnCode.ToString());
      Console.WriteLine();
      Console.Read();
    }

  }
}

Ответ 2

Запрос WMI немного меняется в Vista SP2 и выше.

Попробуйте эту часть \root\SecurityCenter2 вместо\root\SecurityCenter

Результаты также немного отличаются. Вы все равно можете получить отображаемое имя, но вам нужно будет немного маскировать бит для поля ProductState, чтобы определить, включен ли onAccessScanner/отключен и информация типа upToDate.

Ответ 3

Откройте C:\Windows\System32\wbem\wscenter.mof с помощью Блокнота. Это помогает вам, какие пространства имен и классы существуют:


Запрос С#:

// SELECT * FROM AntiVirusProduct
// SELECT * FROM FirewallProduct
// SELECT * FROM AntiSpywareProduct
ManagementObjectSearcher wmiData = new ManagementObjectSearcher(@"root\SecurityCenter2", "SELECT * FROM AntiVirusProduct");
ManagementObjectCollection data = wmiData.Get();

foreach (ManagementObject virusChecker in data)
{
    var virusCheckerName = virusChecker["displayName"];
}

wscenter.mof

#pragma autorecover
#pragma classflags(64)
#pragma namespace("\\\\.\\root")

[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")] 
Instance of __namespace
{
  Name = "SecurityCenter";
};

[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")] 
Instance of __namespace
{
  Name = "SecurityCenter2";
};
#pragma namespace("\\\\.\\root\\SecurityCenter")

class AntiVirusProduct
{
  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] boolean productUptoDate;
  boolean onAccessScanningEnabled;
  boolean productHasNotifiedUser;
  boolean productWantsWscNotifications;
  uint8 productState;
  string companyName;
  string versionNumber;
  string pathToSignedProductExe;
};

class FirewallProduct
{
  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  boolean enabled;
  boolean productHasNotifiedUser;
  boolean productWantsWscNotifications;
  uint8 productState;
  string companyName;
  string versionNumber;
  string pathToSignedProductExe;
};

class AntiSpywareProduct
{
  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] boolean productUptoDate;
  boolean productEnabled;
  boolean productHasNotifiedUser;
  boolean productWantsWscNotifications;
  uint8 productState;
  string companyName;
  string versionNumber;
  string pathToSignedProductExe;
};
#pragma namespace("\\\\.\\root\\SecurityCenter2")

class AntiVirusProduct
{
  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] string pathToSignedProductExe;
  [Not_Null] string pathToSignedReportingExe;
  [Not_Null] uint32 productState;
  string timestamp;
};

class FirewallProduct
{
  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] string pathToSignedProductExe;
  [Not_Null] string pathToSignedReportingExe;
  [Not_Null] uint32 productState;
  string timestamp;
};

class AntiSpywareProduct
{
  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] string pathToSignedProductExe;
  [Not_Null] string pathToSignedReportingExe;
  [Not_Null] uint32 productState;
  string timestamp;
};
#pragma autorecover