18

在寻找答案的过程中,我多次看到类似于以下的代码示例:

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 似乎没有SecurityCenterorSecurityCenter2命名空间,所以我Invalid namespace在尝试这种方法时遇到了异常。

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

4

5 回答 5

6

使用 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 Defender 开始尖叫。

于 2012-12-13T22:48:56.917 回答
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

于 2012-12-14T20:19:52.203 回答
2

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

于 2012-12-10T17:12:31.103 回答
1

这更像是一个想法,而不是一个完美的解决方案。关于莱昂纳多的回答,如何使用实际的防病毒软件(链接)来搜索其他防病毒软件?ClamAV 是开源的,是一个很好的起点。您“仅”需要定义一个新的且相当具体的签名数据库。

于 2012-12-13T19:18:38.633 回答
0

根据大多数网络,SecurityCenter 和 SecurityCenter2 在 Windows Server 2008 上不可用(因为您已经为自己制定了)。

我找到了这篇 SO 文章,其中包含一个解决方法。 如何使用 WMI 或其他 C++ 中的 WMI 检测安装在 Windows 2003 服务器和 2008 服务器 2003 服务器 R2 和 2008 服务器 R2 上的防病毒软件

诚然,这是一个 C++ 实现,但我看不出它不能移植到 C# 的原因

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

于 2012-12-10T14:54:30.607 回答