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

如何在C#中检测Windows Server 2008上的防病毒软件?,c#,windows-server-2008,windows-server-2008-r2,antivirus,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 +

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

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
SecurityCenter 2
命名空间,因此尝试此方法时出现
无效命名空间
异常


有人知道一种确定Windows Server 2008上是否运行防病毒软件的方法吗?感谢您的帮助

根据大多数网站,SecurityCenter和SecurityCenter 2在Windows Server 2008上不可用(正如您已经为自己制定的那样)

我发现了这篇文章,其中包含一个解决方法。

无可否认,这是一个C++实现,但我看不到它不能移植到C<< /p>的原因。 还发现了建议使用OESIS框架的页面。


不久前,我为一个客户端遇到了这个问题,结果我在本地系统驱动程序和进程上执行了口述搜索,寻找已知的防病毒签名模式(如文件夹名称、进程名称等)。这不是100%确定的,因为有人会在某个地方加载一个你不知道的全新防病毒,但除此之外,它非常有效……

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

使用EICAR测试病毒

  • 让您的应用程序尝试在磁盘上写入以下文件之一:
  • 抓住例外
  • 它不仅对地球上的每一种反病毒都有效,而且还会告诉你反病毒是否处于活动状态

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

    X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
    
    请记住,您可能希望在应用程序中对字符串进行编码,并在将其写入磁盘之前对其进行解码。否则,您的应用可能会被检测为病毒:)

    在EICAR网站上,他们说:

    任何支持EICAR测试文件的防病毒产品都应检测到 在任何文件中,只要该文件以以下内容开头,就可以 字符,长度正好为68字节


    但是,我不认为AV开发人员已经阅读了规范,所以最好还是对字符串进行编码。事实上,我刚刚尝试在桌面上的.txt文件中保存字符串,并在其中添加了一些字符,Windows Defender开始尖叫。

    Hmmm,我最终玩了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实例上工作


    此处的更多信息:

    不相关,但要养成使用
    返回实例的习惯。Any()
    而不是
    Count>0
    -如果
    实例
    是一个很长的列表,那么只计算所有成员以查看它们是否超过零是一个坏主意:)@Amitd,这只适用于客户端/桌面操作系统。服务器2003上不存在
    SecurityCenter
    名称空间/2008@carlpett只有当您使用Count()作为IEnumerable而不是集合时,才会出现这种情况。集合中的计数仅访问成员变量,是一个o(1)操作。您是否可以在打开SecurityCenter时访问服务器。它包含在2008中,但默认情况下未启用。看到这个帖子,你可以得到一个运行进程列表,用C++来处理,并循环遍历列表,为你想查找的每个AV产品创建过滤器。所使用的API符合MSDN“仅适用于桌面应用程序”!链接中的答案/评论还指出,它在服务器操作系统环境中不起作用。我真的希望有一个更简单的答案,但听起来这可能是实现我想做的事情的唯一方法……我知道这听起来很乏味和“愚蠢”,但我真的花了一些时间来思考这个问题(好吧,也许我很愚蠢)…我甚至不一定是指你具体的做法,而是指编制一份防病毒产品清单以进行检查的总体思路。特别是因为我检查防病毒的原因与列出一份用于检查hahaIt的防病毒使用列表所需的工作量相比似乎微不足道。这是一种工作,许多病毒、特洛伊木马和蠕虫都会执行这种工作,因此它们可以绕过特定的防病毒扫描程序。这可能看起来有点奇怪,但是从另一个角度寻找关于如何写这些讨厌的废话的来源可能会有所帮助。看看互联网的“黑暗角落”,在那里“病毒作者”相遇…@Leonardo我可能会尝试几种不同的方法,但目前我正在研究C#中的方法。在运行测试文件后,我如何准确地判断反病毒是否处于活动状态?你不运行测试文件。您将无法保存该文件。反病毒会阻止你这么做。所以,如果您试图将包含上述字符串的文本文件写入磁盘,您应该会得到一个异常。要进行双重检查,可以尝试读取该文件。它不应该在那里,因为反病毒检测并删除了它。如果没有,最好检查AV是否正常工作。我将上面的字符串复制到一个文本文件中,并保存得很好。因此,要么Symantec Endpoint Protection不处理该字符串,要么它不是包罗万象的。SEP应该处理该字符串。看这里:我不认为这种方法真的适合我的特定场景。我检查防病毒的目的是因为我们的软件有时不能很好地与防火墙/防病毒配合使用,因此可能将我们的应用程序标记为防病毒可能不是一个好办法。尽管如此,还是投票给有用的信息吧!咖喱