如何确定是否安装了防病毒产品?

如何确定是否安装了防病毒产品?

我们有一个大型安装,有超过 15,000 台机器。它们应该安装了 Trend Micro 的一个版本;但是,我们对此并不确定。

这些都是 Windows 机箱,其中包括具有不同 SP 级别的 XP、Vista RTM 和 SP1,以及多个 2000 和 2003 服务器。

我如何确定:

  1. 是否安装了任何 AV 产品?
  2. 安装的产品是什么版本?
  3. 盒子里的图案文件是什么版本的?

有想法吗?

谢谢,

答案1

由于您谈论的是 15,000 台主机,因此从网络查询每台主机的效率会非常低。

那么,正确的做法™ 就是在每台主机上运行一个看门狗,以确保安装并运行适当的软件。如果您使用 Intel vPro 之类的产品,这个看门狗可能是作为服务运行的软件、计划脚本,甚至是基于硬件的。

要验证 AV 软件是否已安装,可以使用以下 PowerShell 命令:

$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root\cimv2" `
              -computername "." -filter "Name like '%antivirus%'"

请注意,最后您有一个filter可以自定义的参数,以确保您正在查看正确的产品。

在与操作员玩了一会儿之后like,您应该能够确定防病毒描述以及各处的细微变化。请注意,我上面的例子(任何包含“防病毒”一词的内容)都非常简单。你应该寻找与你批准的防病毒软件相匹配的特定模式(例如“Trend Micro Antivirus%”)

无论如何,上面的命令将返回与您的声明相匹配的已安装产品的集合filter。从这里您可以测试是否$avSoftware.Count大于零,在这种情况下您安装了防病毒软件。下面的示例列出了所有已安装的防病毒软件——

if ($avSoftware.Count -gt 0) {
    foreach ($av in $avSoftware) {
        write-host $p.Name
    }
} else {
    write-host "No AV software found"
}

你显然应该做一些更有用的事情,而不是仅仅打印一条消息说没有找到 AV,例如

  • 通知管理员
  • 从网络安装 AV

您还说您想获取已安装 AV 的版本。为此,您可以使用Version的属性Win32_Process。让我们像这样修改上述代码,以便同时打印已安装软件的版本号——

$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root\cimv2" `
              -computername "." -filter "Name like '%antivirus%'"

foreach ($av in $avSoftware) {
    write-host $av.Name, $av.Version
}

至于已安装的病毒定义文件的版本,您必须依赖每个特定的 AV WMI 接口。您必须查阅供应商的文档。

还有一件事要记住。如果 AV 没有运行,那么仅仅知道主机安装了 AV 可能还不够。在检查安装了哪个 AV 后,您应该确保其进程正在运行。为此,您必须知道每个 AV 软件的适当进程是什么,并像这样查找它们——

$processes = get-wmiobject -class "Win32_Process" -namespace "root\cimv2" `
             -computername "." -filter "Name = 'TeaTimer.exe'"

if ($processes.Count -gt 0) {
    foreach ($p in $processes) {
        write-host $p.Name
} else {
    # AV not running. Launch it here or notify someone 
}

上面的例子寻找 Spybot 进程(不完全是 AV,但你明白了),它被称为“TeaTimer.exe”。修改它以寻找你的进程。

现在,如果您要处理数千台这样的主机,您可能应该投资一些管理工具(例如 LANdesk、Microsoft System Center 或 Level Platforms)。这些工具将使您的生活变得轻松很多。

答案2

在当前版本的 Windows(xp sp3+、vista、win 7)中,您可以查询 Windows 安全中心使用的相同 WMI 提供程序,以了解防病毒产品是否已安装且是否是最新的。

以下是一个例子:

Set objSWbemServices = GetObject("winmgmts:\\.\root\SecurityCenter")
Set colFirewall = objSWbemServices.ExecQuery("Select * From antivirusProduct",,48)
For Each objAntiVirusProduct In colFirewall
  WScript.Echo "companyName: " & objAntiVirusProduct.companyName
  WScript.Echo "displayName: " & objAntiVirusProduct.displayName
  WScript.Echo "instanceGuid: " & objAntiVirusProduct.instanceGuid
  WScript.Echo "onAccessScanningEnabled: " & objAntiVirusProduct.onAccessScanningEnabled
  WScript.Echo "productUptoDate: " & objAntiVirusProduct.productUptoDate
  WScript.Echo "versionNumber: " & objAntiVirusProduct.versionNumber
Next

尽管如此,并非所有防病毒产品都会注册 WMI 提供程序,但我怀疑大多数流行的产品都会注册。此外,目前还不清楚微软是否正式支持此功能,因此它可能会在未来的版本中消失。

您可以尝试将它与此处的其他 WMI 建议结合使用,如果此方法不起作用,则返回扫描已安装的产品。

答案3

既然您提到了 Trend Micro,而我们使用的是 Trend,那么我们的做法如下。计划任务会对系统进行全面扫描,并将结果放入文本文件中。实际上,这是一个以日期为文件名的日志文件……例如 C:\TRENDMICRO 文件夹中的 20090517.log。因为其中只有扫描结果,所以它是一个小文件。

在我们大约有 100 台计算机的情况下,服务器上的 powershell 脚本很容易遍历所有计算机,连接这些文件,只查找其中没有字符串“Virus found count(0)”的文件。显然,如果该文件和短语不存在,则说明出现了问题:AV 最近没有运行、发现病毒、AV 未安装等。您可能需要一些更高级的方法才能扩大规模。

但是,难道没有企业版的 AV 可以代替我这个穷人版来为你完成所有工作吗?

答案4

我会制作一个登录脚本,检查各种注册表项或文件以确定产品是否已安装。然后该脚本可以创建已安装或未安装的机器的日志。

Dim WSHShell,strRegKey 
Set WSHShell = WScript.CreateObject("WScript.Shell") 
strRegKey="HKLM\Software\Symantec\Version" 
WSHShell.RegRead(strRegKey) 
Wscript.quit(0) 

相关内容