2023-12-16 22:47:38 +01:00

102 lines
2.6 KiB
C++

// Promene pro vysledek
std::vector<std::string> arr;
ULONG arrcount;
// Funkce pro vynulovani promenych pro vysledek, proc nepouzivm objekty hhahahahhah pomoc
int EmptyRtVars(void) {
arr.clear();
arrcount = 0;
return 0;
}
// https://learn.microsoft.com/en-us/windows/win32/api/wbemcli/nn-wbemcli-ienumwbemclassobject
int GetHWIDs(std::string table, LPCWSTR column) {
std::string retvalue = "";
HRESULT hr;
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr)) {
return 1;
}
IWbemLocator* pIWbemLocator = NULL;
hr = CoCreateInstance(__uuidof(WbemLocator), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IWbemLocator), (LPVOID*)&pIWbemLocator);
if (FAILED(hr)) {
CoUninitialize();
return 1;
}
BSTR bstrServer = SysAllocString(L"\\\\.\\root\\cimv2");
IWbemServices* pIWbemServices;
hr = pIWbemLocator->ConnectServer(bstrServer, NULL, NULL, 0L, 0L, NULL, NULL, &pIWbemServices);
if (FAILED(hr)) {
pIWbemLocator->Release();
SysFreeString(bstrServer);
CoUninitialize();
return 1;
}
hr = CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT);
BSTR bstrWQL = SysAllocString(L"WQL");
// Poskladani WQL Query z parametru funkce a prevod datatypu
std::string wqlquery = "select * from " + table;
std::wstring wide_string = std::wstring(wqlquery.begin(), wqlquery.end());
const wchar_t* result = wide_string.c_str();
BSTR bstrPath = SysAllocString(result);
IEnumWbemClassObject* pEnum;
hr = pIWbemServices->ExecQuery(bstrWQL, bstrPath, WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum);
// Enumerace objektu/radku
ULONG uReturned;
VARIANT var;
IWbemClassObject* pObj[100];
if (!FAILED(hr)) {
hr = pEnum->Next(WBEM_INFINITE, 100, pObj, &uReturned);
}
// Ziskani hodnot vlastnosti/sloupce
if (!FAILED(hr) && uReturned) {
for (ULONG n = 0; n < uReturned; n++) {
hr = pObj[n]->Get(column, 0, &var, NULL, NULL);
if (SUCCEEDED(hr)) {
char str[MAX_PATH];
WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, str, sizeof(str), NULL, NULL);
retvalue = str;
if (V_VT(&var) == VT_BSTR) {
arr.push_back(retvalue);
pObj[n]->Release();
//return uReturned;
}
else {
arr.push_back("Empty");
pObj[n]->Release();
//return uReturned;
}
}
else {
return 1; // Nepodarilo se ziskat hodnoty
}
}
}
else {
return 1; // Nepodarilo se enumerovat objekty/radky
}
arrcount = uReturned;
//pEnum->Release();
//SysFreeString(bstrPath);
//SysFreeString(bstrWQL);
//pIWbemServices->Release();
//pIWbemLocator->Release();
//SysFreeString(bstrServer);
//CoUninitialize();
return 0;
}