wmi.cpp
4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "wmi.h"
#ifdef Q_OS_WIN
wmi::wmi()
{
}
QJsonValue wmi::wmiSearch(QString classe, QStringList params)
{
QJsonValue wmiReturn;
QJsonObject itemWmi;
QJsonArray arrayItens;
QString paramsString;
if (!params.empty()){
for(int i = 0; i!=params.size();i++)
paramsString.append(params.at(i) + ((i != params.size() - 1) ? "," : ""));
}
QString query = "SELECT " + ((!paramsString.isEmpty()) ? paramsString : "*") + " FROM " + classe;
//conecta ao script (Como já estamos usando QObject, o WbemScripting... não funciona chamando normal,
// por isso deve ser usado o CoInitializeEx)
::CoInitializeEx(NULL, COINIT_MULTITHREADED);
QAxObject *objIWbemLocator = new QAxObject();
objIWbemLocator->setControl("WbemScripting.SWbemLocator");
if (objIWbemLocator->isNull())
return QJsonValue();
//conecta ao wmi
QAxObject *objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)",
QString("."),
QString("root\\CIMV2")
);
// qDebug() << ">>>>>>>>>" << objIWbemLocator->isNull() << objWMIService->isNull();
//Faz a pesquisa no wmi
QAxObject* returnList = objWMIService->querySubObject("ExecQuery(QString&)", query);
// qDebug() << "<<<<<<<<<<<<<<<<<<<<<<<";
QAxObject *enum1 = returnList->querySubObject("_NewEnum");
IEnumVARIANT* enumInterface = 0;
enum1->queryInterface(IID_IEnumVARIANT, (void**)&enumInterface);
enumInterface->Reset();
int countReturnListObj = returnList->dynamicCall("Count").toInt();
for (int i = 0; i < countReturnListObj; i++) {
VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT));
if (enumInterface->Next(1,theItem,NULL) != S_FALSE){
QAxObject *item = new QAxObject((IUnknown *)theItem->punkVal);
if(item){
//pega o retorno da query
QString instance = item->dynamicCall("GetObjectText_(int)", QVariant(0)).toString();
QStringList instanceList = instance.split("\n\t");
//Pra cada linha grava no json os valores com cada tag
foreach(QString value, instanceList){
QStringList valueList = value.split("=");
if (valueList.size() > 1){
QString tag = valueList.at(0).trimmed();
QString aux = valueList.at(1).trimmed();
aux.remove("\"");
aux.remove(";");
aux.remove("\n");
//verifica se é lista
if(aux.startsWith("{") && aux.endsWith("}")){
QStringList auxList = aux.split(",");
QJsonArray jList;
foreach(QString valueList, auxList){
if (valueList.contains("{"))
valueList.remove("{");
if (valueList.contains("}"))
valueList.remove("}");
if (!valueList.trimmed().isEmpty())
jList.append(valueList.trimmed());
}
itemWmi[tag] = jList;
} else {
//O último valor sempre volta com "}" no final.
if (aux.contains("}"))
aux.remove("}");
if (!aux.trimmed().isEmpty())
itemWmi[tag] = QJsonValue::fromVariant(aux.trimmed());
}
}
} // foreach(QString value, instanceList)
} // if(item)
} // if (enumInterface->Next(1,theItem,NULL) != S_FALSE)
//Se houver mais de um objeto, grava em uma lista
if (countReturnListObj > 1){
arrayItens.append(QJsonValue(itemWmi));
}
}
objIWbemLocator->clear();
::CoUninitialize();
//se for mais de um objeto, retorna array.
if (!arrayItens.isEmpty())
wmiReturn = QJsonValue(arrayItens);
//senão, se o objeto não for vazio (se tiver coletado algo)
else if (!itemWmi.isEmpty())
wmiReturn = QJsonValue(itemWmi);
return wmiReturn;
}
#endif //def Q_OS_WIN