Обнаружение антивируса в Windows с помощью C# [закрыто]

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

3 ответов


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

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

антивирусные сигнатуры обновлены.

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

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

для того, чтобы определить наличие антивирусного программного обеспечения, вы можете использовать WMI подключении к root\SecurityCenter пространство имен (начиная с Windows Vista, вы должны использовать root\SecurityCenter2 namespace), а затем запросить 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();
    }

  }
}

запрос WMI немного изменяется в Vista SP2 и за его пределами.

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

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


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


В C# Запрос:

// 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.МОФ:

#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