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

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

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

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();
    }

  }
}

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

Хммм, я закончил игру с 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

Ответ 4

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

Ответ 5

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

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

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

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