如何在C#中检测Windows Server 2008上的防病毒软件?

时间:2012-12-05 21:00:11

标签: c# windows-server-2008 windows-server-2008-r2 antivirus

我在搜索答案时已经看过很多次类似以下的代码示例:

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似乎没有SecurityCenterSecurityCenter2命名空间,因此尝试此方法时会出现Invalid namespace异常。

有谁知道确定Windows Server 2008上是否有防病毒软件运行的方法?任何帮助表示赞赏!

5 个答案:

答案 0 :(得分:6)

使用EICAR测试病毒。

  1. 让您的应用程序尝试在磁盘上写下其中一个文件:http://www.eicar.org/85-0-Download.html
  2. 抓住例外
  3. 它不仅适用于地球上的每一种反病毒,它还会告诉你抗病毒是否有效!

    如果您的防病毒处于活动状态,您可能会发现很难下载测试文件,因此您可能希望使用此字符串:

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

    请记住,您可能希望在应用程序中保留编码字符串并在将其写入磁盘之前对其进行解码。否则,您的应用可能会被检测为病毒:)

    在EICAR网站上,他们说:

      

    任何支持EICAR测试文件的防病毒产品都应该检测到   它在任何文件中提供该文件以下面的68开头   字符,正好是68字节长

    但是,我不认为AV开发人员已经阅读了规范,所以最好只保留字符串编码。事实上,我只是尝试将字符串保存在桌面上的.txt文件中,其中包含一些其他字符,Windows Defender开始尖叫。

答案 1 :(得分: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

答案 2 :(得分:2)

前段时间我遇到了一个客户端问题,最后我在本地系统驱动程序和进程上执行了dictonary搜索,寻找已知的防病毒签名模式(例如文件夹名称,进程名称等)。 。)它不是100%肯定,因为在某个地方有人会下载你不知道的全新的反病毒,但除此之外,它非常有效...

答案 3 :(得分:1)

这不是一个完美的解决方案。关于莱昂纳多的答案,如何使用实际的反病毒软件(链接它)来搜索其他反病毒软件? ClamAV是开源的,是一个很好的起点。您“只”需要定义一个新的特别是特定的签名数据库。

答案 4 :(得分:0)

根据大多数网站的说法,Windows Server 2008上没有SecurityCenter和SecurityCenter2(因为您已经为自己设计过了)。

我找到了这篇SO文章,其中包含一个解决方法。 How to detect antivirus installed on windows 2003 server and 2008 server 2003 server R2and 2008 server R2 using WMI or other then WMI in C++

不可否认,这是一个C ++实现,但我认为没有理由不能将它移植到C#

还发现此页面建议使用OESIS框架。 http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/b0806608-fee0-413c-a34d-674aeb11be3c