【问题标题】:How to detect antivirus installed on windows 2003 server and 2008 server 2003 server R2and 2008 server R2 using WMI or other then WMI in C++如何使用 WMI 或其他 C++ 中的 WMI 检测安装在 Windows 2003 服务器和 2008 服务器 2003 服务器 R2 和 2008 服务器 R2 上的防病毒软件
【发布时间】:2011-05-22 18:11:09
【问题描述】:

我已使用 WMI 来检测操作系统上是否存在防病毒软件, 通过使用命名空间:\root\SecurityCenter 和 \root\SecurityCenter,\root\Security,它可以正常工作并在 win xp 和 window7 上向我显示防病毒信息,例如名称和实例 ID。

if(isHLOSVersion( ))

 hres = pLoc->ConnectServer( _bstr_t(L"root\\SecurityCenter2"),
 // Object path of SecurityCenter 

 NULL,                    // User name. NULL = current user 

         NULL,                    // User password. NULL = current 

         0,                       // Locale. NULL indicates current 

         NULL,                    // Security flags. 

         0,                       // Authority (e.g. Kerberos) 

         0,                       // Context object  

         &pSvc                    // pointer to IWbemServices proxy 

         ); 
 else
  hres = pLoc->ConnectServer( _bstr_t(L"root\\SecurityCenter"),
 // Object path of SecurityCenter 

   NULL,                    // User name. NULL = current user 

         NULL,                    // User password. NULL = current 

         0,                       // Locale. NULL indicates current 

         NULL,                    // Security flags. 

         0,                       // Authority (e.g. Kerberos) 

         0,                       // Context object  

         &pSvc                    // pointer to IWbemServices proxy 

         ); 

但在 windows 2003 server 和 2008 server 2003 server R2 和 2008 server R2 的情况下,上述命名空间不存在,所以这在那里不起作用。

请告诉我如何检测是否存在防病毒软件 windows 2003 server 和 2008 server 2003 server R2 和 2008 server R2 操作系统。

【问题讨论】:

  • 输入代码示例时请使用代码标签,当前状态下没有人会尝试读取。

标签: c++ wmi wmi-query wmi-service


【解决方案1】:

该命名空间在 Windows Server 平台上不可用,我认为它可能已被 Workstation 弃用(即消失)。

您或许可以使用 WscGetSecurityProviderHealth() 来获得相同的结果。

http://msdn.microsoft.com/en-us/library/bb432506.aspx

这是我的看似可行的简单示例:

#define _WIN32_WINNT _WIN32_WINNT_WIN7
#include <Windows.h>
#include <Wscapi.h>
#include <iostream>

#pragma comment(lib, "Wscapi")


int main(int argc, char* argv[])
{
   WSC_SECURITY_PROVIDER_HEALTH health;
   const DWORD dwAntivirus(WSC_SECURITY_PROVIDER_ANTIVIRUS);

   HRESULT hr = WscGetSecurityProviderHealth(dwAntivirus, &health);
   if (FAILED(hr))
   {
      std::cerr << "Error " << std::hex 
                << std::showbase << hr << "\n";
      return -1;
   }
   switch (health)
   {
      case WSC_SECURITY_PROVIDER_HEALTH_GOOD:
         std::cout << "Antivirus health is good\n";
         return 0;
      case WSC_SECURITY_PROVIDER_HEALTH_NOTMONITORED:
         std::cout << "Antivirus health is not monitored\n";
         return 1;
      case WSC_SECURITY_PROVIDER_HEALTH_POOR:
         std::cout << "Antivirus health is poor\n";
         return 2;
      case WSC_SECURITY_PROVIDER_HEALTH_SNOOZE:
         std::cout << "Antivirus health is snooze\n";
         return 3;
      default:
         std::cout << "Unexpected antivirus health value: "
                   << std::hex << std::showbase 
                   << health << "\n";
         return 4;
   }
}

2012 年 12 月 9 日更新

Alex 指出(如下),这在 Windows Server 上不起作用,仅在 Windows 的 Workstation 版本上起作用。回想起来,我想到这可能是故意的,事实上,可能是最好的。

应用程序真的需要知道服务器的状态吗?大多数服务器安全程序都有在失败时设置警报的机制。管理员将监控这些警报并修复损坏的内容。应用程序应该简单地表现得好像安全是完全可操作的。

如果您真的必须了解某个特定程序,您可以在进程中查找它的 exe 名称,并查看该进程是否正在运行并且正在消耗 cpu(未挂起)。除此之外,您可能需要与安全程序的供应商合作:他们可能有一个 API 来查询该程序。

【讨论】:

  • 根据您发布的文章,该功能似乎仅适用于桌面应用程序,服务器不支持。
  • @Alex - 你是对的 - 我的错误。实际上,这是有道理的。服务器安全确实是与工作站安全不同的野兽。我怀疑是否有太多服务器运行消费级安全程序。
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 2011-07-13
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多