Как обнаружить антивирус, установленный на Windows 2003 Server и 2008 Server 2003 Server R2 и 2008 Server R2, с помощью WMI или другого, кроме WMI, на C ++

Я использовал WMI, чтобы обнаружить, что антивирус присутствует в ОС, он работает нормально и отображает мне информацию об антивирусе, такую ​​как имя и идентификатор экземпляра на win xp и window7, используя пространство имен: \ 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 server и 2008 server 2003 server R2and 2008 server R2 это пространство имен отсутствует, поэтому там это не работает.

Пожалуйста, дайте мне знать, как мы можем определить, присутствует ли антивирус в операционной системе Windows 2003 server и 2008 server 2003 server R2 и 2008 server R2.


person Sourabh Gupta    schedule 09.12.2010    source источник
comment
Пожалуйста, используйте тег кода при вводе примеров кода, никто не будет пытаться прочитать его в текущем состоянии.   -  person Adrian Fâciu    schedule 09.12.2010


Ответы (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;
   }
}

Обновление от 9 декабря 2012 г.

Алекс указывает (ниже), что это не работает на Windows Server, только на версиях Windows для рабочих станций. Поразмыслив, мне приходит в голову, что это, вероятно, сделано намеренно и, на самом деле, вероятно, к лучшему.

Действительно ли прикладным программам нужно знать статус сервера? Большинство программ безопасности для серверов имеют механизмы для установки сигналов тревоги, когда они выходят из строя. Администратор будет отслеживать эти сигналы и исправлять неисправности. Прикладные программы должны просто вести себя так, как если бы система безопасности полностью работоспособна.

Если вы действительно должны знать о конкретной программе, вы можете найти ее исполняемое имя среди процессов и посмотреть, работает ли процесс и потребляет ли он процессор (не зависает). Помимо этого, вам может потребоваться работа с поставщиком программы безопасности: у них может быть API для запроса программы.

person Michael J    schedule 02.03.2011
comment
Согласно опубликованной вами статье, похоже, что функция предназначена только для настольных приложений и не поддерживается на серверах. - person athom; 07.12.2012
comment
@Alex - Вы правы - моя ошибка. На самом деле в этом есть смысл. Безопасность сервера действительно отличается от безопасности рабочей станции. Я сомневаюсь, что на слишком большом количестве серверов работают программы безопасности потребительского уровня. - person Michael J; 09.12.2012