Как обнаружить антивирус на Windows Server 2008 В C#?

Я видел примеры кода, похожие на следующие несколько раз в моем поиске ответа:

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

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

      string wmipathstr = @"" + Environment.MachineName + @"rootSecurityCenter";
      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();
    }

  }
}

к сожалению, похоже, что Windows Server 2008 не имеет SecurityCenter или SecurityCenter2 пространство имен, поэтому я получаю Invalid namespace исключение при попытке этот подход.

кто-нибудь знает способ определить, есть ли антивирусное программное обеспечение, работающее на Windows Server 2008? Любая помощь приветствуется!

5 ответов


Я столкнулся с этой проблемой некоторое время назад для клиента, и я закончил выполнение диктонарного поиска по локальным системным драйверам и процессам, ищущим шаблон известных антивирусных сигнатур (таких как имена папок, имена процессов и т. д...) это не 100% уверен, потому что где-то кто-то будет donwload совершенно новый антивирус, что вы unware, но это в стороне, это было очень эффективно...


используйте тестовый вирус EICAR.

  1. пусть ваше приложение попытается записать один из этих файлов на диск:http://www.eicar.org/85-0-Download.html
  2. поймать исключение

Он будет работать не только на каждом антивирусе на земле, но он также скажет вам, если антивирус активен!

вам может быть трудно загрузить тестовый файл, если у вас активен антивирус, поэтому вы можете использовать эту строку вместо этого:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

имейте в виду, вы, вероятно, хотите сохранить строку закодированной в вашем приложении и декодировать ее непосредственно перед записью на диск. В противном случае вы можете рисковать ваше приложение будет обнаружено как вирус :)

на сайте EICAR они говорят:

любой антивирусный продукт, поддерживающий тестовый файл EICAR, должен обнаружить он в любом файле при условии, что файл начинается со следующей 68 символов, и ровно 68 байт долго

однако я бы не считал, что разработчики AV прочитали спецификацию, поэтому лучше просто сохранить строку в кодировке. На самом деле, я просто пытался сохранить строку на .txt-файл на моем рабочем столе с некоторыми дополнительными символами в нем, и Защитник Windows начал кричать.


хммм, я закончил играть с PowerShell:

$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root\cimv2" -computername "." -filter "Name like '%antivirus%'"
if ($avSoftware.Count -gt 0) {
    foreach ($av in $avSoftware) {
        write-host $p.Name
    }
} else {
    write-host "No AV software found"
}

похоже, что он работает как на наших экземплярах Windows Server 2008, так и на 2008 R2...

дополнительная информация здесь: https://serverfault.com/questions/12343/how-can-i-determine-whether-an-antivirus-product-is-installed


Это скорее идея, чем идеальное решение. Что касается ответа Леонардо, как насчет использования фактического фрагмента антивирусного программного обеспечения (ссылка против него) для выполнения поиска другого антивирусного программного обеспечения? ClamAV-это открытый источник и хорошая точка для начала. Вам "только" нужно определить новую и довольно конкретную базу данных сигнатур.


в соответствии с большинством веб-страниц SecurityCenter и SecurityCenter2 недоступны в Windows Server 2008 (Как вы уже разработали для себя).

Я нашел эту статью SO, которая содержит обходной путь. как определить антивирус установленный на Windows 2003 Server и 2008 Server, на сервере 2003 R2 и 2008 сервер R2 с помощью WMI или других затем WMI в C++

по общему признанию, это реализация C++, но я не вижу причин, по которым ее нельзя портировать на В C#

также нашел эту страницу, которая предлагает использовать oesis framework. http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/b0806608-fee0-413c-a34d-674aeb11be3c