Test
This commit is contained in:
79
shared/WMI.c
Normal file
79
shared/WMI.c
Normal file
@@ -0,0 +1,79 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user