Как обнаружить антивирус, установленный на Windows 2003 Server и 2008 Server 2003 Server R2 и 2008 Server R2, используя WMI или другой, чем WMI в C ++ - PullRequest
3 голосов
/ 09 декабря 2010

Я использовал WMI, чтобы обнаружить, что антивирус присутствует в ОС, itz проснулся нормально и отображает информацию антивируса, такую ​​как имя и идентификатор экземпляра на 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 R2 и 2008 Server R2 вышеприведенное пространство имен отсутствует, поэтому оно там не работает.

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

1 Ответ

2 голосов
/ 02 марта 2011

Это пространство имен недоступно на платформах Windows Server, и я думаю, что оно может быть устаревшим для рабочей станции (т. Е. Удалено).

Возможно, вы можете использовать WscGetSecurityProviderHealth (), чтобы получить тот же результат.1004 * См. 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 для рабочих станций.Размышляя, мне приходит в голову, что это, вероятно, преднамеренно и, по сути, вероятно, к лучшему.

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

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

...