Как обнаружить антивирус, установленный на 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 R2 и 2008 Server R2 эти вышеперечисленные пространства имен отсутствуют, так что это не работает там.
Пожалуйста, дайте мне знать, как мы можем обнаружить, что антивирус присутствует или нет Windows 2003 Server и 2008 Server 2003 Server R2 и 2008 Server R2 операционной системы.
1 ответ
Это пространство имен недоступно на платформах Windows Server, и я думаю, что оно может быть устаревшим для рабочей станции (то есть удалено).
Вероятно, вы можете использовать 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 для рабочих станций. Размышляя, мне приходит в голову, что это, вероятно, преднамеренно и, на самом деле, вероятно, к лучшему.
Действительно ли прикладные программы должны знать состояние сервера? Большинство программ безопасности для серверов имеют механизмы для установки аварий при сбое. Администратор будет отслеживать эти сигналы и исправлять неисправности. Прикладные программы должны просто вести себя так, как будто безопасность полностью работоспособна.
Если вы действительно должны знать о конкретной программе, вы можете найти ее exe-имя среди процессов и посмотреть, работает ли процесс и потребляет ли он процессор (не завис). Помимо этого вам может понадобиться работать с поставщиком программы безопасности: у них может быть API для запроса программы.