WUIsBack/shared/WMI.c

80 lines
2.4 KiB
C

#include "stdafx.h"
#include "WMI.h"
#include <wbemcli.h>
#pragma comment(lib, "wbemuuid.lib")
#ifdef __cplusplus
#define our_CLSID_WbemLocator CLSID_WbemLocator
#define our_IID_IWbemLocator IID_IWbemLocator
#define IWbemLocator_ConnectServer(obj, ...) obj->ConnectServer(__VA_ARGS__)
#define IWbemServices_ExecQuery(obj, ...) obj->ExecQuery(__VA_ARGS__)
#define IEnumWbemClassObject_Next(obj, ...) obj->Next(__VA_ARGS__)
#define IWbemClassObject_Get(obj, ...) obj->Get(__VA_ARGS__)
#define IWbemClassObject_Release(obj) obj->Release()
#define IEnumWbemClassObject_Release(obj) obj->Release()
#define IWbemServices_Release(obj) obj->Release()
#define IWbemLocator_Release(obj) obj->Release()
#else
#define our_CLSID_WbemLocator &CLSID_WbemLocator
#define our_IID_IWbemLocator &IID_IWbemLocator
#endif
HRESULT QueryWMIProperty(LPWSTR query, LPWSTR property, LPVARIANT value) {
IWbemLocator *locator = NULL;
IWbemServices *services = NULL;
IEnumWbemClassObject *enumerator = NULL;
IWbemClassObject *object = NULL;
HRESULT hr = CoCreateInstance(our_CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, our_IID_IWbemLocator, (void **)&locator);
if (!SUCCEEDED(hr)) {
goto end;
}
BSTR server = SysAllocString(L"ROOT\\CIMV2");
hr = IWbemLocator_ConnectServer(locator, server, NULL, NULL, NULL, 0, NULL, NULL, &services);
SysFreeString(server);
if (!SUCCEEDED(hr)) {
goto end;
}
hr = CoSetProxyBlanket((IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if (!SUCCEEDED(hr)) {
goto end;
}
BSTR wql = SysAllocString(L"WQL");
BSTR queryBstr = SysAllocString(query);
hr = IWbemServices_ExecQuery(services, wql, queryBstr, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumerator);
SysFreeString(wql);
SysFreeString(queryBstr);
if (!SUCCEEDED(hr)) {
goto end;
}
ULONG uReturn = 0;
hr = IEnumWbemClassObject_Next(enumerator, WBEM_INFINITE, 1, &object, &uReturn);
if (!SUCCEEDED(hr)) {
goto end;
}
BSTR propBstr = SysAllocString(property);
hr = IWbemClassObject_Get(object, propBstr, 0, value, NULL, NULL);
SysFreeString(propBstr);
end:
if (object) {
IWbemClassObject_Release(object);
}
if (enumerator) {
IEnumWbemClassObject_Release(enumerator);
}
if (services) {
IWbemServices_Release(services);
}
if (locator) {
IWbemLocator_Release(locator);
}
return hr;
}