3

私は WMI を使用して OS にアンチウイルスが存在することを検出しました。それは正常に動作し、Win XP および Window7 の名前やインスタンス ID などのアンチウイルスの情報を Namespace:\root\SecurityCenter および \root\SecurityCenter, \root\Security を使用して表示します。 .

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 サーバーおよび 2008 サーバー 2003 サーバー R2 および 2008 サーバー R2 の場合、上記の名前空間が存在しないため、そこでは機能しません。

Windows 2003 サーバーおよび 2008 サーバー 2003 サーバー R2 および 2008 サーバー R2 オペレーティング システムにウイルス対策が存在するかどうかを検出する方法を教えてください。

4

1 に答える 1

2

その名前空間は 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 を持っている場合があります。

于 2011-03-02T17:30:34.870 に答える