unsigned long long loadngo::data::GetMachineId() { // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ // HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); // if (hr == S_OK) // { BSTR objectPath = SysAllocString(L"ROOT\\CIMV2"); std::vector<char> container; // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ HRESULT hr = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (hr == S_OK) { // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hr = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); if (hr == S_OK) { // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hr = pLoc->ConnectServer( objectPath, // Object path of WMI namespace 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 ); if (hr == S_OK) { // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hr = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (hr == S_OK) { // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- BSTR wql = SysAllocString(L"WQL"); BSTR query = SysAllocString(L"SELECT * FROM Win32_BIOS"); // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hr = pSvc->ExecQuery( wql, query, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (hr == S_OK) { // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } if(pclsObj->BeginEnumeration(0) == S_OK) { BSTR name = nullptr; VARIANT var; while (pclsObj->Next(0, &name, &var, nullptr, nullptr) == WBEM_S_NO_ERROR) { Insert(container, name); SysFreeString(name); InsertVariant(container, var); VariantClear(&var); } } pclsObj->Release(); } } pEnumerator->Release(); } pSvc->Release(); pSvc = 0; } pLoc->Release(); } } SysFreeString(objectPath); // CoUninitialize(); //} return util::FNV1a(&container[0], container.size()); }
/****************************************************************************** * * * Function: zbx_wmi_get_variant * * * * Purpose: retrieves WMI value and stores it in the provided memory location * * * * Parameters: wmi_namespace [IN] - object path of the WMI namespace (UTF-8) * * wmi_query [IN] - WQL query (UTF-8) * * vtProp [OUT] - pointer to memory for the queried value * * * * Return value: SYSINFO_RET_OK - *vtProp contains the retrieved WMI value * * SYSINFO_RET_FAIL - retreiving WMI value failed * * * * Comments: *vtProp must be initialized with VariantInit(), * * wmi_* must not be NULL. The callers must convert value to the * * intended format using VariantChangeType() * * * ******************************************************************************/ extern "C" int zbx_wmi_get_variant(const char *wmi_namespace, const char *wmi_query, VARIANT *vtProp) { IWbemLocator *pLoc = 0; IWbemServices *pService = 0; IEnumWbemClassObject *pEnumerator = 0; IWbemClassObject *pclsObj = 0; ULONG uReturn = 0; int ret = SYSINFO_RET_FAIL; HRESULT hres; wchar_t *wmi_namespace_wide; wchar_t *wmi_query_wide; /* 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, "cannot obtain WMI locator service"); goto out; } wmi_namespace_wide = zbx_utf8_to_unicode(wmi_namespace); hres = pLoc->ConnectServer(_bstr_t(wmi_namespace_wide), NULL, NULL, 0, NULL, 0, 0, &pService); zbx_free(wmi_namespace_wide); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot obtain %s WMI service", wmi_namespace); goto out; } /* set the IWbemServices proxy so that impersonation of the user (client) occurs */ hres = CoSetProxyBlanket(pService, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot set IWbemServices proxy"); goto out; } wmi_query_wide = zbx_utf8_to_unicode(wmi_query); hres = pService->ExecQuery(_bstr_t("WQL"), _bstr_t(wmi_query_wide), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); zbx_free(wmi_query_wide); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "failed to execute WMI query %s", wmi_query); goto out; } hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) goto out; hres = pclsObj->BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot start WMI query result enumeration"); goto out; } hres = pclsObj->Next(0, NULL, vtProp, 0, 0); pclsObj->EndEnumeration(); if (FAILED(hres) || hres == WBEM_S_NO_MORE_DATA) goto out; ret = SYSINFO_RET_OK; out: if (0 != pclsObj) pclsObj->Release(); if (0 != pEnumerator) pEnumerator->Release(); if (0 != pService) pService->Release(); if (0 != pLoc) pLoc->Release(); return ret; }