使用 C# 在 Windows 上检测防病毒软件 [关闭]

Posted

技术标签:

【中文标题】使用 C# 在 Windows 上检测防病毒软件 [关闭]【英文标题】:Detect Antivirus on Windows using C# [closed] 【发布时间】:2010-11-22 20:17:12 【问题描述】:

有没有办法用C#检测机器上是否安装了杀毒软件?我知道安全中心会检测到防病毒软件,但您如何在 C# 中检测到呢?

【问题讨论】:

可以使用WMI;见here。 有什么方法可以知道windows 7@Angel.King.47系统上的杀毒是否更新 【参考方案1】:

根据 Microsoft 的说法,Windows 安全中心使用两层方法检测状态。一层是手动的,另一层是通过 Windows Management Instrumentation (WMI) 自动完成的。在手动检测模式下,Windows 安全中心搜索由独立软件制造商提供给 Microsoft 的注册表项和文件。这些注册表项和文件让 Windows 安全中心可以检测独立软件的状态。在 WMI 模式下,软件制造商确定自己的产品状态,并通过 WMI 提供程序将该状态报告回 Windows 安全中心。在这两种模式下,Windows 安全中心都会尝试确定以下是否为真:

存在防病毒程序。

防病毒签名是最新的。

已为防病毒程序启用实时扫描或读写扫描。

对于防火墙,Windows 安全中心会检测是否安装了第三方防火墙以及防火墙是否开启。

因此,为了确定是否存在杀毒软件,您可以使用 WMI 连接到 root\SecurityCenter 命名空间(从 windows Vista 开始,您必须使用 root\SecurityCenter2 命名空间),然后查询 @ 987654323@WMI 类。

看看这个示例代码

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 7 上怎么做吗? 在 Windows 7 中,您必须使用 \root\SecurityCenter2 命名空间 我在 Windows server 2008 上尝试过。但是,我得到一个异常“无效的命名空间”。它适用于 Windows 7。 这些类仅在 Windows 桌面版中可用。 好的,谢谢..如果在服务器上安装了防病毒软件,我有什么办法可以找到吗?【参考方案2】:

用记事本打开C:\Windows\System32\wbem\wscenter.mof。它可以帮助您存在哪些命名空间和类:


C# 查询

// SELECT * FROM AntiVirusProduct
// SELECT * FROM FirewallProduct
// SELECT * FROM AntiSpywareProduct
ManagementObjectSearcher wmiData = new ManagementObjectSearcher(@"root\SecurityCenter2", "SELECT * FROM AntiVirusProduct");
ManagementObjectCollection data = wmiData.Get();

foreach (ManagementObject virusChecker in data)

    var virusCheckerName = virusChecker["displayName"];


wscenter.mof

#pragma autorecover
#pragma classflags(64)
#pragma namespace("\\\\.\\root")

[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")] 
Instance of __namespace

  Name = "SecurityCenter";
;

[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")] 
Instance of __namespace

  Name = "SecurityCenter2";
;
#pragma namespace("\\\\.\\root\\SecurityCenter")

class AntiVirusProduct

  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] boolean productUptoDate;
  boolean onAccessScanningEnabled;
  boolean productHasNotifiedUser;
  boolean productWantsWscNotifications;
  uint8 productState;
  string companyName;
  string versionNumber;
  string pathToSignedProductExe;
;

class FirewallProduct

  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  boolean enabled;
  boolean productHasNotifiedUser;
  boolean productWantsWscNotifications;
  uint8 productState;
  string companyName;
  string versionNumber;
  string pathToSignedProductExe;
;

class AntiSpywareProduct

  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] boolean productUptoDate;
  boolean productEnabled;
  boolean productHasNotifiedUser;
  boolean productWantsWscNotifications;
  uint8 productState;
  string companyName;
  string versionNumber;
  string pathToSignedProductExe;
;
#pragma namespace("\\\\.\\root\\SecurityCenter2")

class AntiVirusProduct

  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] string pathToSignedProductExe;
  [Not_Null] string pathToSignedReportingExe;
  [Not_Null] uint32 productState;
  string timestamp;
;

class FirewallProduct

  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] string pathToSignedProductExe;
  [Not_Null] string pathToSignedReportingExe;
  [Not_Null] uint32 productState;
  string timestamp;
;

class AntiSpywareProduct

  [key,Not_Null] string instanceGuid;
  [Not_Null] string displayName;
  [Not_Null] string pathToSignedProductExe;
  [Not_Null] string pathToSignedReportingExe;
  [Not_Null] uint32 productState;
  string timestamp;
;
#pragma autorecover

【讨论】:

【参考方案3】:

WMI 查询在 Vista SP2 及更高版本中略有变化。

试试这部分 \root\SecurityCenter2 而不是 \root\SecurityCenter

结果也略有不同。您仍然可以获得显示名称,但您需要对 ProductState 字段进行一些位屏蔽,以确定 onAccessScanner 是否启用/禁用以及 upToDate 类型的信息。

【讨论】:

以上是关于使用 C# 在 Windows 上检测防病毒软件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C# 应用程序被检测为病毒

带有 API 的 Windows Server 2008 防病毒软件 [关闭]

Bashware攻击:在Windows系统上运行Linux恶意软件

Windows 10浏览器无法下载软件,显示有病毒怎么办?

AVG 防病毒软件禁用了网络摄像头

如何以编程方式检查 Windows 是不是是最新的?