如何检测是不是安装了病毒扫描程序和/或防火墙? (以及其他一些与安全相关的问题。)
Posted
技术标签:
【中文标题】如何检测是不是安装了病毒扫描程序和/或防火墙? (以及其他一些与安全相关的问题。)【英文标题】:How to detect if a virusscanner and/or firewall is installed? (And a few other security-related Q's.)如何检测是否安装了病毒扫描程序和/或防火墙? (以及其他一些与安全相关的问题。) 【发布时间】:2009-09-22 10:45:40 【问题描述】:我有一个应用程序,我正在尝试确保它在安全的环境中运行。首先,我检查Windows is genuine,这使得用户更有可能保持最新状态。如果没有,我只会弹出一条消息,警告用户可能存在风险,因为他仍需要验证 Windows。
现在,我想做更多的事情。我还想检查用户是否安装了病毒扫描程序。我不在乎是哪一个,只要他安装了一个。然后检查是否安装了防火墙。如果可能的话,我想检查用户上次更新他的 Windows/扫描仪/防火墙的时间,以确保它不会太旧。所以:
1) 如何检查是否安装了病毒扫描程序? 2) 如何确定病毒扫描程序的更新时间? 3) 如何检测病毒扫描程序最后一次全系统检查的时间? 4) 如何检测防火墙是否已安装并处于活动状态? 5) 如何检查 Windows 何时收到最新更新?
基本上,当我的应用程序启动时,我想显示一个带有警告的屏幕(每天仅一次),以防万一这些事情出现问题。这是因为我的应用程序使用用户从其客户那里收集的各种敏感信息。 (其中包括银行帐号、护照身份证号码、NAW+DOB、收入等等。)基本上,如果系统有问题,用户必须确认他知道这些问题。如果他在知道他的系统可能不安全的情况下继续使用,我的应用程序可能会承担责任......
还有语言?基本上 C++ 或 Delphi 用于 WIN32 示例和 C# 用于 .NET 示例。它更多的是关于 .NET/Windows API/.NET 而不是语言。
【问题讨论】:
【参考方案1】:我认为您可以通过WMI 完成大部分操作
类似这样的:
ManagementObjectSearcher wmiData = new ManagementObjectSearcher(@"root\SecurityCenter", "SELECT * FROM AntiVirusProduct");
ManagementObjectCollection data = wmiData.Get();
foreach (ManagementObject virusChecker in data)
// This is the virus checkers name.
String virusCheckerName = virusChecker["displayName"];
[你没有提到什么语言,所以上面的示例是用 C# 编写的,但是 WMI 几乎可以用任何东西来完成]
[编辑:您可以做同样的事情,但使用“FirewallProduct”代替防火墙信息。此外,对于防病毒,您可以查看结果中的“productUptoDate”属性,了解它是否是最新的]
WMI reference 应该可以帮助您找到其他人。 (我很确定 1、2、3 和 4 可以通过 WMI 获得。5 我不太确定,但我认为应该可以)
您可能会发现WMI Code Creator 有助于测试和确定您需要使用哪些查询/对象。 Scriptomatic 和 WMI Admin tools 也可能有用。
【讨论】:
C# 很好,尽管语言并不重要。重要的是 API/.NET 调用。 很酷,希望对您有所帮助。你的问题有点难以回答,因为它有很多部分。一旦您对 WMI 进行了一些探索,如果您仍然特别坚持其中一个,请发布一个新问题并只关注一点。这样,希望您能找到确切知道在哪里查找该数据的人。除了基本水平,我对 WMI 的了解并不多。【参考方案2】:由于我在寻找 C++ 而不是 .NET 依赖的方式,因此我在这个答案和 MSDN example: Getting WMI Data from the Local Computer 之间混为一谈。
为了获取 AV 名称需要更改的命令是:
_bstr_t(L"ROOT\\CIMV2")
到 _bstr_t(L"ROOT\\SecurityCenter2")
。请记住,根据this,SecurityCenter2 适用于 Win 7、Vista SP2 及更高版本。在 Vista SP2 以下,您需要使用SecurityCenter。
bstr_t("SELECT * FROM Win32_OperatingSystem")
到 bstr_t("SELECT * FROM AntivirusProduct")
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
到 hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);
。
这个更改的代码已经过检查并且可以正常工作。
对于更简单的方法,您始终可以遍历 this algorithm 并按名称查找您的 AV。
【讨论】:
以上是关于如何检测是不是安装了病毒扫描程序和/或防火墙? (以及其他一些与安全相关的问题。)的主要内容,如果未能解决你的问题,请参考以下文章
检测 Windows 机器是不是运行病毒扫描程序? [复制]