diff -Nru zabbix-1.8.5-orig/build/win32/project/Makefile_agent zabbix-1.8.5-wmi/build/win32/project/Makefile_agent --- zabbix-1.8.5-orig/build/win32/project/Makefile_agent 2011-04-15 22:17:30.000000000 +0300 +++ zabbix-1.8.5-wmi/build/win32/project/Makefile_agent 2011-06-30 11:15:01.135092900 +0300 @@ -6,9 +6,12 @@ MT = mt.exe MESSAGES_H = messages.h INCS = /I .\ /I ..\include /I ..\..\..\include /I ..\..\..\src\zabbix_agent -CFLAGS = $(INCS) /O2 /Ob1 /GF /FD /EHsc /MT /Gy /W3 /c /TC /D _WINDOWS /D _CONSOLE /D UNICODE /D _UNICODE /D NDEBUG /D WIN32 /D HAVE_WINLDAP_H /D HAVE_ASSERT_H /D ZABBIX_SERVICE /D WITH_COMMON_METRICS /D WITH_SPECIFIC_METRICS /D WITH_SIMPLE_METRICS /D "_VC80_UPGRADE=0x0600" /D HAVE_IPV6 +COMPILER_FLAGS = $(INCS) /O2 /Ob1 /GF /FD /EHsc /MT /Gy /W3 /c /D _WINDOWS /D _CONSOLE /D UNICODE /D _UNICODE /D NDEBUG /D WIN32 /D HAVE_WINLDAP_H /D HAVE_ASSERT_H /D ZABBIX_SERVICE /D WITH_COMMON_METRICS /D WITH_SPECIFIC_METRICS /D WITH_SIMPLE_METRICS /D "_VC80_UPGRADE=0x0600" /D HAVE_IPV6 +CFLAGS = $(COMPILER_FLAGS) /TC +CPPFLAGS = $(COMPILER_FLAGS) RESOURCE_H = resource.res OBJS = ..\..\..\src\libs\zbxcommon\alias.o ..\..\..\src\libs\zbxcommon\comms.o ..\..\..\src\libs\zbxcommon\gnuregex.o ..\..\..\src\libs\zbxcommon\misc.o ..\..\..\src\libs\zbxcommon\regexp.o ..\..\..\src\libs\zbxcommon\str.o ..\..\..\src\libs\zbxcommon\xml.o ..\..\..\src\libs\zbxcommon\zbxgetopt.o ..\..\..\src\libs\zbxcommon\file.o ..\..\..\src\libs\zbxcomms\comms.o ..\..\..\src\libs\zbxconf\cfg.o ..\..\..\src\libs\zbxcrypto\base64.o ..\..\..\src\libs\zbxcrypto\md5.o ..\..\..\src\libs\zbxjson\json.o ..\..\..\src\libs\zbxlog\log.o ..\..\..\src\libs\zbxsys\mutexs.o ..\..\..\src\libs\zbxsys\symbols.o ..\..\..\src\libs\zbxsys\threads.o ..\..\..\src\libs\zbxexec\execute.o ..\..\..\src\libs\zbxsysinfo\common\common.o ..\..\..\src\libs\zbxsysinfo\common\file.o ..\..\..\src\libs\zbxsysinfo\common\http.o ..\..\..\src\libs\zbxsysinfo\common\net.o ..\..\..\src\libs\zbxsysinfo\common\system.o ..\..\..\src\libs\zbxsysinfo\simple\ntp.o ..\..\..\src\libs\zbxsysinfo\simple\simple.o ..\..\..\src\libs\zbxsysinfo\win32\cpu.o ..\..\..\src\libs\zbxsysinfo\win32\diskio.o ..\..\..\src\libs\zbxsysinfo\win32\diskspace.o ..\..\..\src\libs\zbxsysinfo\win32\memory.o ..\..\..\src\libs\zbxsysinfo\win32\net.o ..\..\..\src\libs\zbxsysinfo\win32\pdhmon.o ..\..\..\src\libs\zbxsysinfo\win32\proc.o ..\..\..\src\libs\zbxsysinfo\win32\services.o ..\..\..\src\libs\zbxsysinfo\win32\swap.o ..\..\..\src\libs\zbxsysinfo\win32\uptime.o ..\..\..\src\libs\zbxsysinfo\win32\win32.o ..\..\..\src\libs\zbxsysinfo\sysinfo.o ..\..\..\src\libs\zbxwin32\perfmon.o ..\..\..\src\libs\zbxwin32\service.o ..\..\..\src\zabbix_agent\active.o ..\..\..\src\zabbix_agent\cpustat.o ..\..\..\src\zabbix_agent\diskdevices.o ..\..\..\src\zabbix_agent\eventlog.o ..\..\..\src\zabbix_agent\listener.o ..\..\..\src\zabbix_agent\logfiles.o ..\..\..\src\zabbix_agent\perfstat.o ..\..\..\src\zabbix_agent\stats.o ..\..\..\src\zabbix_agent\zabbix_agentd.o ..\..\..\src\zabbix_agent\zbxconf.o +OBJS = $(OBJS) ..\..\..\src\libs\zbxsysinfo\win32\wmi.o LIBS = ws2_32.lib psapi.lib pdh.lib Wldap32.lib advapi32.lib uuid.lib Iphlpapi.lib LFLAGS = /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"zabbix_agentd.exe.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:"zabbix_agentd.pdb" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /MACHINE:X86 @@ -141,6 +144,9 @@ ..\..\..\src\libs\zbxsysinfo\sysinfo.o: ..\..\..\src\libs\zbxsysinfo\sysinfo.c $(CC) ..\..\..\src\libs\zbxsysinfo\sysinfo.c /Fo"..\..\..\src\libs\zbxsysinfo\sysinfo.o" $(CFLAGS) +..\..\..\src\libs\zbxsysinfo\win32\wmi.o: ..\..\..\src\libs\zbxsysinfo\win32\wmi.cpp + $(CC) ..\..\..\src\libs\zbxsysinfo\win32\wmi.cpp /Fo"..\..\..\src\libs\zbxsysinfo\win32\wmi.o" $(CPPFLAGS) + ..\..\..\src\libs\zbxwin32\perfmon.o: ..\..\..\src\libs\zbxwin32\perfmon.c $(CC) ..\..\..\src\libs\zbxwin32\perfmon.c /Fo"..\..\..\src\libs\zbxwin32\perfmon.o" $(CFLAGS) diff -Nru zabbix-1.8.5-orig/include/sysinfo.h zabbix-1.8.5-wmi/include/sysinfo.h --- zabbix-1.8.5-orig/include/sysinfo.h 2011-04-15 22:17:28.000000000 +0300 +++ zabbix-1.8.5-wmi/include/sysinfo.h 2011-06-30 11:13:18.034783900 +0300 @@ -274,6 +274,18 @@ int SERVICES(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result); int PROC_INFO(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result); int NET_IF_LIST(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result); + +#ifdef __cplusplus +extern "C" +{ +#endif + +int WMI_GET(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result); + +#ifdef __cplusplus +} +#endif + #endif /* _WINDOWS */ #ifdef _AIX diff -Nru zabbix-1.8.5-orig/src/libs/zbxsysinfo/win32/win32.c zabbix-1.8.5-wmi/src/libs/zbxsysinfo/win32/win32.c --- zabbix-1.8.5-orig/src/libs/zbxsysinfo/win32/win32.c 2011-04-15 22:17:29.000000000 +0300 +++ zabbix-1.8.5-wmi/src/libs/zbxsysinfo/win32/win32.c 2011-06-30 11:13:18.057786200 +0300 @@ -50,6 +50,7 @@ {"services", CF_USEUPARAM, SERVICES, 0, 0}, {"perf_counter", CF_USEUPARAM, PERF_COUNTER, 0, "\\System\\Processes"}, {"proc_info", CF_USEUPARAM, PROC_INFO, 0, "svchost.exe"}, + {"wmi.get", CF_USEUPARAM, WMI_GET, 0, "root\\cimv2,SELECT * FROM Win32_OperatingSystem,"}, {"__UserPerfCounter", CF_USEUPARAM, USER_PERF_COUNTER, 0, ""}, diff -Nru zabbix-1.8.5-orig/src/libs/zbxsysinfo/win32/wmi.cpp zabbix-1.8.5-wmi/src/libs/zbxsysinfo/win32/wmi.cpp --- zabbix-1.8.5-orig/src/libs/zbxsysinfo/win32/wmi.cpp 1970-01-01 02:00:00.000000000 +0200 +++ zabbix-1.8.5-wmi/src/libs/zbxsysinfo/win32/wmi.cpp 2011-06-30 11:13:18.080788500 +0300 @@ -0,0 +1,248 @@ + +#include "sysinc.h" + +extern "C" { +#include "common.h" +#include "sysinfo.h" +#include "log.h" +} + +#include +#include + +# pragma comment(lib, "wbemuuid.lib") + + + extern "C" int WMI_GET(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) +{ + char wmi_namespace[MAX_STRING_LEN] = {0}; + char wmi_query[MAX_STRING_LEN] = {0}; + char wmi_field[30] = {0}; + char param_type[30] = {0}; + + int ret = SYSINFO_RET_FAIL; + IWbemClassObject *pclsObj; + ULONG uReturn = 0; + VARIANT vtProp; + IWbemLocator *pLoc = 0; + IWbemServices *pService = 0; + IEnumWbemClassObject* pEnumerator = 0; + HRESULT hres; + VARTYPE vt = VT_EMPTY; + int params_count; + + VariantInit(&vtProp); + + params_count = num_param(param); + + if (params_count != 3 && params_count != 4) { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: Need 3 parameters"); + return SYSINFO_RET_FAIL; + } + + if (0 != get_param(param, 1, wmi_namespace, sizeof(wmi_namespace))) + return SYSINFO_RET_FAIL; + + if (0 != get_param(param, 2, wmi_query, sizeof(wmi_query))) + return SYSINFO_RET_FAIL; + + if (0 != get_param(param, 3, wmi_field, sizeof(wmi_field))) + return SYSINFO_RET_FAIL; + + if( params_count > 3 ) { + if (0 != get_param(param, 4, param_type, sizeof(param_type))) + return SYSINFO_RET_FAIL; + + if( 0 == zbx_strcasestr( param_type, "int64") ) + vt = VT_I8; + else + if( 0 == zbx_strcasestr( param_type, "text") ) + vt = VT_BSTR; + else { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: Unknown type"); + return SYSINFO_RET_FAIL; + } + + } + + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET[wmi_namespace]: %s", wmi_namespace); + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET[wmi_query]: %s", wmi_query); + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET[wmi_field]: %s", wmi_field); + + hres = CoInitializeEx(0, COINIT_MULTITHREADED); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: CoInitializeEx failed"); + return SYSINFO_RET_FAIL; + } + + // Initialize Security + hres = CoInitializeSecurity( NULL, + -1, // COM negotiates service + NULL, // Authentication services + NULL, // Reserved + RPC_C_AUTHN_LEVEL_DEFAULT, // authentication + RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation + NULL, // Authentication info + EOAC_NONE, // Additional capabilities + NULL // Reserved + ); + + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: CoInitializeSecurity failed"); + goto clean; + } + + // Obtain the initial locator to Windows Management + // on a particular host computer. + hres = CoCreateInstance( + CLSID_WbemLocator, + 0, + CLSCTX_INPROC_SERVER, + IID_IWbemLocator, (LPVOID *) &pLoc); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: CoCreateInstance failed"); + goto clean; + } + + hres = pLoc->ConnectServer( + _bstr_t(wmi_namespace), // WMI namespace + NULL, // User name + NULL, // User password + 0, // Locale + NULL, // Security flags + 0, // Authority + 0, // Context object + &pService // IWbemServices proxy + ); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: ConnectServer failed"); + goto clean; + } + + // Set the IWbemServices proxy so that impersonation + // of the user (client) occurs. + hres = CoSetProxyBlanket( + pService, // the proxy to set + RPC_C_AUTHN_WINNT, // authentication service + RPC_C_AUTHZ_NONE, // authorization service + NULL, // Server principal name + RPC_C_AUTHN_LEVEL_CALL, // authentication level + RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level + NULL, // client identity + EOAC_NONE // proxy capabilities + ); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: CoSetProxyBlanket failed"); + goto clean; + } + + hres = pService->ExecQuery( + bstr_t("WQL"), + bstr_t(wmi_query), + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, + NULL, + &pEnumerator); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: ExecQuery failed"); + goto clean; + } + + hres = pEnumerator->Next(WBEM_INFINITE, 1, + &pclsObj, &uReturn); + + if(0 == uReturn) + { + ret = SYSINFO_RET_OK; + goto clean; + } + + // Get the value of the Name property + hres = pclsObj->Get(_bstr_t(wmi_field), 0, &vtProp, 0, 0); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: Get propertie failed"); + goto clean; + } + + if( vt == VT_EMPTY ) + vt = vtProp.vt; + + switch(vt) + { + case VT_EMPTY: + case VT_NULL: + break; + case VT_I8: // LONGLONG + case VT_I4: // LONG + case VT_UI1: // BYTE + case VT_I2: // SHORT + case VT_I1: // CHAR + case VT_UI2: // USHORT + case VT_UI4: // ULONG + case VT_UI8: // ULONGLONG + case VT_INT: // INT + case VT_UINT: // UINT + hres = VariantChangeType( &vtProp, &vtProp, 0, VT_I8); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: VariantChangeType(VT_I8) failed"); + goto clean; + } + + SET_UI64_RESULT(result, vtProp.llVal); + break; + case VT_R4: // FLOAT + case VT_R8: // DOUBLE + hres = VariantChangeType( &vtProp, &vtProp, 0, VT_R8); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: VariantChangeType(VT_R8) failed"); + goto clean; + } + + SET_DBL_RESULT(result, vtProp.dblVal); + + break; + default: + // case VT_DATE: // DATE + // case VT_BOOL: // VARIANT_BOOL + // case VT_BSTR: // BSTR + hres = VariantChangeType( &vtProp, &vtProp, VARIANT_ALPHABOOL, VT_BSTR); + if (FAILED(hres)) + { + zabbix_log(LOG_LEVEL_DEBUG, "WMI_GET: VariantChangeType(VT_BSTR) failed"); + goto clean; + } + + SET_TEXT_RESULT(result, zbx_strdup(NULL, (char*)_bstr_t(vtProp.bstrVal))); + break; + }; + + ret = SYSINFO_RET_OK; +clean: + + VariantClear(&vtProp); + + if(pEnumerator) + pEnumerator->Release(); + + if(pService) + pService->Release(); + + if(pLoc) + pLoc->Release(); + + CoUninitialize(); + + return ret; +} + + + +