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

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


person Angel.King.47    schedule 26.08.2009    source источник
comment
Вы можете использовать WMI; см. здесь .   -  person SLaks    schedule 26.08.2009
comment
есть ли способ узнать, обновлен ли антивирус в системе в windows [email protected]   -  person TechBrkTru    schedule 08.06.2015


Ответы (3)


Согласно Microsoft, Центр безопасности Windows использует двухуровневый подход к определению статуса обнаружения. Один уровень является ручным, а другой - автоматическим с помощью инструментария управления Windows (WMI). В ручном режиме обнаружения Центр обеспечения безопасности Windows выполняет поиск ключей и файлов реестра, предоставленных Microsoft независимыми производителями программного обеспечения. Эти ключи и файлы реестра позволяют Центру обеспечения безопасности Windows определять статус независимого программного обеспечения. В режиме 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();
    }

  }
}
person RRUZ    schedule 26.08.2009
comment
У кого-нибудь, как это сделать на Windows 7? - person aHunter; 09.10.2009
comment
В Windows 7 необходимо использовать пространство имен \root\SecurityCenter2 - person RRUZ; 07.02.2011
comment
Я пробовал это на Windows server 2008. Однако я получаю исключение Invalid Namespace. Работает на Windows 7. - person bazzinga; 25.06.2013
comment
Эти классы доступны только в выпусках Windows Desktop. - person RRUZ; 26.06.2013
comment
Хорошо, спасибо .. есть ли способ узнать, установлен ли на сервере антивирус? - person bazzinga; 26.06.2013
comment
@RahilMansuri, попробуйте вот это stackoverflow.com/questions/13732351/ - person RRUZ; 26.06.2013
comment
@RRUZ Я уже пробовал это .. не работает .. там написано .. классы securityCenter и securityCenter2 отсутствуют для серверных редакций - person bazzinga; 26.06.2013
comment
Проверить принятый ответ ... I ended up performing a dictonary search on the local system drivers and processes looking for a pattern of know anti-virus signatures (such as folder names, processes names, etc...) - person RRUZ; 26.06.2013
comment
@RRUZ да, это последнее средство .. я надеялся найти другой способ сделать это .. - person bazzinga; 26.06.2013
comment
Есть ли способ получить информацию об обновлении версии антивируса в Win 7 @RRUZ - person TechBrkTru; 05.06.2015
comment
Что делать, если я хочу добавить эти данные для моего собственного антивирусного продукта, есть ли способ их вставить ??? - person Digvijay Rathore; 02.11.2015

Откройте 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.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
person Amir Saniyan    schedule 09.01.2017

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

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

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

person jeff    schedule 09.10.2010