From d6cd8f135e7c62b68af86e98f0108224d795e41e Mon Sep 17 00:00:00 2001 From: ericmenezesn@gmail.com Date: Mon, 1 Sep 2014 17:39:35 -0300 Subject: [PATCH] Classe wmi --- cacic-teste/cacic-teste.pro | 2 ++ cacicD/cacicD.pro | 2 +- cacicD/cacicd.cpp | 2 +- gercols/gercols.pro | 2 ++ gercols/main.cpp | 1 + install-cacic/install-cacic.pro.user | 2 +- src/cacic_computer.cpp | 4 ++-- src/cacic_hardware.cpp | 248 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/cacic_hardware.h | 4 +--- src/cacic_software.h | 1 - src/operatingsystem.cpp | 19 +++++++++---------- src/operatingsystem.h | 4 +++- src/qtservice/common.pri | 2 +- src/wmi.cpp | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/wmi.h | 6 ++++++ 15 files changed, 202 insertions(+), 188 deletions(-) diff --git a/cacic-teste/cacic-teste.pro b/cacic-teste/cacic-teste.pro index e395746..3c0d0ce 100644 --- a/cacic-teste/cacic-teste.pro +++ b/cacic-teste/cacic-teste.pro @@ -29,6 +29,7 @@ SOURCES += \ ../src/vqtconvert.cpp \ ../src/vregistry.cpp \ ../src/ccoleta.cpp \ + ../src/wmi.cpp \ # ../src/qtservice/src/qtservice.cpp \ # ../src/qtservice/src/qtservice_unix.cpp \ # ../src/qtservice/src/qtservice_win.cpp \ @@ -48,6 +49,7 @@ HEADERS += \ ../src/vqtconvert.h \ ../src/vregistry.h \ ../src/ccoleta.h \ + ../src/wmi.h \ # ../src/qtservice/src/qtservice.h \ # ../src/qtservice/src/qtservice_p.h \ # ../src/qtservice/src/qtunixserversocket.h \ diff --git a/cacicD/cacicD.pro b/cacicD/cacicD.pro index 4de78c7..9295d4c 100644 --- a/cacicD/cacicD.pro +++ b/cacicD/cacicD.pro @@ -6,7 +6,7 @@ QT += core QT -= gui - +QT += network TARGET = cacicD CONFIG += console CONFIG -= app_bundle diff --git a/cacicD/cacicd.cpp b/cacicD/cacicd.cpp index c8fd075..1302f49 100644 --- a/cacicD/cacicd.cpp +++ b/cacicD/cacicd.cpp @@ -4,7 +4,7 @@ cacicD::cacicD(int argc, char **argv) : QtService(argc, argv, { try{ setServiceDescription("Cacic Daemon"); - setServiceFlags(QtServiceBase::CannotBeStopped); + setServiceFlags(QtService::Default); } catch (...){ qCritical() << "Error desconhecido no construtor."; } diff --git a/gercols/gercols.pro b/gercols/gercols.pro index 6e67e08..cd34958 100644 --- a/gercols/gercols.pro +++ b/gercols/gercols.pro @@ -34,6 +34,7 @@ SOURCES += \ ./gercols.cpp \ ../src/vregistry.cpp \ ../src/vqtconvert.cpp \ + ../src/wmi.cpp \ HEADERS += \ ../src/ccacic.h \ @@ -46,6 +47,7 @@ HEADERS += \ ./gercols.h \ ../src/vregistry.h \ ../src/vqtconvert.h \ + ../src/wmi.h \ INCLUDEPATH += ../src \ ../src/crypto++/include/ diff --git a/gercols/main.cpp b/gercols/main.cpp index ac1069a..4ea596f 100644 --- a/gercols/main.cpp +++ b/gercols/main.cpp @@ -4,6 +4,7 @@ int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); + a.setApplicationName("Gercols"); //crio o objeto que será responsável pela execução Gercols *oGercols = new Gercols(&a); diff --git a/install-cacic/install-cacic.pro.user b/install-cacic/install-cacic.pro.user index e0ffb11..20aa34c 100644 --- a/install-cacic/install-cacic.pro.user +++ b/install-cacic/install-cacic.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget diff --git a/src/cacic_computer.cpp b/src/cacic_computer.cpp index 7edf013..01ca997 100644 --- a/src/cacic_computer.cpp +++ b/src/cacic_computer.cpp @@ -14,11 +14,11 @@ CACIC_Computer::CACIC_Computer() * */ QList CACIC_Computer::networkInterfacesRunning(){ - QNetworkInterface interface; + QNetworkInterface netInterface; QVariantMap mapInterface; QList listaMap; - foreach (QNetworkInterface in, interface.allInterfaces()) { + foreach (QNetworkInterface in, netInterface.allInterfaces()) { if (!(bool)(in.flags() & QNetworkInterface::IsLoopBack) && !(bool)(in.flags() & QNetworkInterface::IsPointToPoint) && (bool)(in.flags() & QNetworkInterface::IsRunning)){ diff --git a/src/cacic_hardware.cpp b/src/cacic_hardware.cpp index 4f55175..7368174 100644 --- a/src/cacic_hardware.cpp +++ b/src/cacic_hardware.cpp @@ -16,133 +16,137 @@ QJsonObject cacic_hardware::coletaWin() { QJsonObject hardware; QStringList params; - QJsonValue wmi; + QJsonValue wmiResult; // Win32_ComputerSystem (Caption, Description, Domain, DNSHostName, Manufacturer, // Model, Name, PrimaryOwnerName, TotalPhysicalMemory, Workgroup) params << "Caption" << "Description" << "Domain" << "DNSHostName" << "Manufacturer" << "Model" << "Name" << "PrimaryOwnerName" << "TotalPhysicalMemory" << "Workgroup"; - wmi = wmiSearch("Win32_ComputerSystem", params); - if (!wmi.isNull()) - hardware["ComputerSystem"] = wmi; + wmiResult = wmi::wmiSearch("Win32_ComputerSystem", params); + if (!wmiResult.isNull()) + hardware["ComputerSystem"] = wmiResult; //Win32_PortableBattery // (Verifica se é notebook) params.clear(); - hardware["IsNotebook"] = QJsonValue::fromVariant(!wmiSearch("Win32_PortableBattery", params).isNull()); + wmiResult = wmi::wmiSearch("Win32_PortableBattery", params); + if (!wmiResult.isNull()){ + hardware["IsNotebook"] = QJsonValue::fromVariant(!wmiResult.isNull()); + hardware["PortableBattery"] = wmiResult; + } //Win32_Bios // (Manufacturer, SMBIOSBIOSVersion, BIOSVersion, Version, SerialNumber, ReleaseDate) params.clear(); params << "Manufacturer" << "SMBIOSBIOSVersion" << "BIOSVersion" << "Version" << "SerialNumber" << "ReleaseDate"; - wmi = wmiSearch("Win32_Bios", params); - if (!wmi.isNull()) - hardware["Bios"] = wmi; + wmiResult = wmi::wmiSearch("Win32_Bios", params); + if (!wmiResult.isNull()) + hardware["Bios"] = wmiResult; //Win32_BaseBoard // (Manufacturer, Model, SerialNumber) params.clear(); params << "Manufacturer" << "Model" << "SerialNumber"; - wmi = wmiSearch("Win32_Baseboard", params); - if (!wmi.isNull()) - hardware["BaseBoard"] = wmi; + wmiResult = wmi::wmiSearch("Win32_Baseboard", params); + if (!wmiResult.isNull()) + hardware["BaseBoard"] = wmiResult; //Win32_SystemEnclosure // (Manufacturer, ChassisTypes, SerialNumber, SMBIOSAssetTag) params.clear(); params << "Manufacturer" << "ChassisTypes" << "SerialNumber" << "SMBIOSAssetTag"; - wmi = wmiSearch("Win32_SystemEnclosure", params); - if (!wmi.isNull()) - hardware["SystemEnclosure"] = wmi; + wmiResult = wmi::wmiSearch("Win32_SystemEnclosure", params); + if (!wmiResult.isNull()) + hardware["SystemEnclosure"] = wmiResult; //Win32_FloppyDrive // (Manufacturer, Caption, Description, Name, MediaType, Size) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name"; - wmi = wmiSearch("Win32_FloppyDrive", params); - if (!wmi.isNull()) - hardware["FloppyDrive"] = wmi; + wmiResult = wmi::wmiSearch("Win32_FloppyDrive", params); + if (!wmiResult.isNull()) + hardware["FloppyDrive"] = wmiResult; //Win32_DiskDrive // (Manufacturer, Caption, Description, Name, MediaType, Size, SerialNumber, Model, FirmwareRevision) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name" << "MediaType" << "Size" << "SerialNumber" << "Model" << "FirmwareRevision"; - wmi = wmiSearch("Win32_DiskDrive", params); - if (!wmi.isNull()) - hardware["DiskDrive"] = wmi; + wmiResult = wmi::wmiSearch("Win32_DiskDrive", params); + if (!wmiResult.isNull()) + hardware["DiskDrive"] = wmiResult; //Win32_CDROMDrive // (Manufacturer, Caption, Description, Name, MediaType, Size) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "MediaType" << "Name" << "Size"; - wmi = wmiSearch("Win32_CDROMDrive", params); - if (!wmi.isNull()) - hardware["CDROMDrive"] = wmi; + wmiResult = wmi::wmiSearch("Win32_CDROMDrive", params); + if (!wmiResult.isNull()) + hardware["CDROMDrive"] = wmiResult; //Win32_FloppyController // (Manufacturer, Caption, Description, Name) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name"; - wmi = wmiSearch("Win32_FloppyController", params); - if (!wmi.isNull()) - hardware["FloppyController"] = wmi; + wmiResult = wmi::wmiSearch("Win32_FloppyController", params); + if (!wmiResult.isNull()) + hardware["FloppyController"] = wmiResult; //Win32_SCSIController // (Manufacturer, Caption, Description, Name, HardwareVersion) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name" << "HardwareVersion"; - wmi = wmiSearch("Win32_SCSIController", params); - if (!wmi.isNull()) - hardware["SCSIController"] = wmi; + wmiResult = wmi::wmiSearch("Win32_SCSIController", params); + if (!wmiResult.isNull()) + hardware["SCSIController"] = wmiResult; //Win32_InfraredDevice // (Manufacturer, Caption, Description, Name) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name"; - wmi = wmiSearch("Win32_InfraredDevice", params); - if (!wmi.isNull()) - hardware["InfraredDevice"] = wmi; + wmiResult = wmi::wmiSearch("Win32_InfraredDevice", params); + if (!wmiResult.isNull()) + hardware["InfraredDevice"] = wmiResult; //Win32_USBController // (Manufacturer, Caption, Description, Name) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name"; - wmi = wmiSearch("Win32_USBController", params); - if (!wmi.isNull()) - hardware["USBController"] = wmi; + wmiResult = wmi::wmiSearch("Win32_USBController", params); + if (!wmiResult.isNull()) + hardware["USBController"] = wmiResult; //Win32_PCMCIAController // (Manufacturer, Caption, Description, Name) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "Name"; - wmi = wmiSearch("Win32_PCMCIAController", params); - if (!wmi.isNull()) - hardware["PCMCIAController"] = wmi; + wmiResult = wmi::wmiSearch("Win32_PCMCIAController", params); + if (!wmiResult.isNull()) + hardware["PCMCIAController"] = wmiResult; //Win32_VideoController // (Description, VideoProcessor, AdapterRAM, CurrentHorizontalResolution, CurrentVerticalResolution, Caption, Name) params.clear(); params << "VideoProcessor" << "AdapterRAM" << "Description" << "Name" << "CurrentHorizontalResolution" << "CurrentVerticalResolution" << "Caption" << "AcceleratorCapabilities"; - wmi = wmiSearch("Win32_VideoController", params); - if (!wmi.isNull()) - hardware["VideoController"] = wmi; + wmiResult = wmi::wmiSearch("Win32_VideoController", params); + if (!wmiResult.isNull()) + hardware["VideoController"] = wmiResult; //Win32_DesktopMonitor // (MonitorManufacturer, Caption, Description, MonitorType, Name) params.clear(); params << "MonitorManufacturer" << "Caption" << "Description" << "MonitorType" << "Name"; - wmi = wmiSearch("Win32_DesktopMonitor", params); - if (!wmi.isNull()) - hardware["DesktopMonitor"] = wmi; + wmiResult = wmi::wmiSearch("Win32_DesktopMonitor", params); + if (!wmiResult.isNull()) + hardware["DesktopMonitor"] = wmiResult; //Win32_Printer // (Name, DriverName, PortName, ServerName, ShareName, HorizontalResolution, VerticalResolution, Comment, Shared, Network) params.clear(); params << "Name" << "DriverName" << "PortName" << "ServerName" << "ShareName" << "HorizontalResolution" << "VerticalResolution" << "Comment" << "Shared" << "Network"; - wmi = wmiSearch("Win32_Printer", params); - if (!wmi.isNull()) - hardware["Printer"] = wmi; + wmiResult = wmi::wmiSearch("Win32_Printer", params); + if (!wmiResult.isNull()) + hardware["Printer"] = wmiResult; //Win32_PortConnector // (ExternalReferenceDesignator, PortType (verificar), ConnectorType (verificar), Manufacturer, Caption, Name) params.clear(); params << "ExternalReferenceDesignator" << "PortType" << "ConnectorType" << "Name" << "Caption" << "Manufacturer"; - wmi = wmiSearch("Win32_PortConnector", params); - if (!wmi.isNull()) - hardware["PortConnector"] = wmi; + wmiResult = wmi::wmiSearch("Win32_PortConnector", params); + if (!wmiResult.isNull()) + hardware["PortConnector"] = wmiResult; //Win32_SerialPort // (Name, Caption, Description, StatusInfo) params.clear(); params << "Name" << "Caption" << "Description" << "StatusInfo"; - wmi = wmiSearch("Win32_SerialPort", params); - if (!wmi.isNull()) - hardware["SerialPort"] = wmi; + wmiResult = wmi::wmiSearch("Win32_SerialPort", params); + if (!wmiResult.isNull()) + hardware["SerialPort"] = wmiResult; //Win32_Processor // (MaxClockSpeed, Name, Architecture, NumberOfCores, SocketDesignation, Manufacturer, Architecture, NumberOfCores // CurrentClockSpeed, MaxClockSpeed, L2CacheSize, AddressWidth, DataWidth, VoltageCaps, CpuStatus, @@ -151,154 +155,64 @@ QJsonObject cacic_hardware::coletaWin() params << "MaxClockSpeed" << "Name" << "Architecture" << "NumberOfCores" << "SocketDesignation" << "Manufacturer" << "Architecture" << "NumberOfCores" << "CurrentClockSpeed" << "MaxClockSpeed" << "L2CacheSize" << "AddressWidth" << "DataWidth" << "VoltageCaps" << "CpuStatus" << "ProcessorId" << "UniqueId" << "AddressWidth"; - wmi = wmiSearch("Win32_Processor", params); - if (!wmi.isNull()) - hardware["Processor"] = wmi; + wmiResult = wmi::wmiSearch("Win32_Processor", params); + if (!wmiResult.isNull()) + hardware["Processor"] = wmiResult; //Win32_OperatingSystem // (Name, Version, CSDVersion, Description, InstallDate, Organization, RegisteredUser, SerialNumber) params.clear(); params << "Name" << "Version" << "CSDVersion" << "Description" << "InstallDate" << "Organization" << "RegisteredUser" << "SerialNumber"; - wmi = wmiSearch("Win32_OperatingSystem", params); - if (!wmi.isNull()) - hardware["OperatingSystem"] = wmi; + wmiResult = wmi::wmiSearch("Win32_OperatingSystem", params); + if (!wmiResult.isNull()) + hardware["OperatingSystem"] = wmiResult; //Win32_SystemSlot // (Name, Description, SlotDesignation, CurrentUsage, Status, Shared) params.clear(); params << "Name" << "Description" << "SlotDesignation" << "CurrentUsage" << "Status" << "Shared"; - wmi = wmiSearch("Win32_SystemSlot", params); - if (!wmi.isNull()) - hardware["SystemSlot"] = wmi; + wmiResult = wmi::wmiSearch("Win32_SystemSlot", params); + if (!wmiResult.isNull()) + hardware["SystemSlot"] = wmiResult; //Win32_LogicalDisk // (Caption, DriveType, Filesystem, VolumeName, ProviderName, Filesystem, VolumeName, Size, FreeSpace) params.clear(); params << "Caption" << "DriveType" << "Filesystem" << "VolumeName" << "ProviderName" << "Filesystem" << "VolumeName" << "Size" << "FreeSpace"; - wmi = wmiSearch("Win32_LogicalDisk", params); - if (!wmi.isNull()) - hardware["LogicalDisk"] = wmi; + wmiResult = wmi::wmiSearch("Win32_LogicalDisk", params); + if (!wmiResult.isNull()) + hardware["LogicalDisk"] = wmiResult; //Win32_PhysicalMemory // (Caption, Description, BankLabel, DeviceLocator, Capacity, Speed, MemoryType, SerialNumber) params.clear(); params << "Caption" << "Description" << "BankLabel" << "DeviceLocator" << "Capacity" << "Speed" << "MemoryType"; - wmi = wmiSearch("Win32_PhysicalMemory", params); - if (!wmi.isNull()) - hardware["PhysicalMemory"] = wmi; + wmiResult = wmi::wmiSearch("Win32_PhysicalMemory", params); + if (!wmiResult.isNull()) + hardware["PhysicalMemory"] = wmiResult; //Win32_Keyboard // (Caption, Description, Name) params.clear(); params << "Caption" << "Description" << "Name" << "Layout"; - wmi = wmiSearch("Win32_Keyboard", params); - if (!wmi.isNull()) - hardware["Keyboard"] = wmi; + wmiResult = wmi::wmiSearch("Win32_Keyboard", params); + if (!wmiResult.isNull()) + hardware["Keyboard"] = wmiResult; //Win32_PointingDevice // (Manufacturer, Caption, Description, PointingType, DeviceInterface) params.clear(); params << "Manufacturer" << "Caption" << "Description" << "PointingType" << "DeviceInterface"; - wmi = wmiSearch("Win32_PointingDevice", params); - if (!wmi.isNull()) - hardware["PointingDevice"] = wmi; + wmiResult = wmi::wmiSearch("Win32_PointingDevice", params); + if (!wmiResult.isNull()) + hardware["PointingDevice"] = wmiResult; //Win32_PnPSignedDriver // (Manufacturer, DeviceName, Description, Location, DeviceClass) params.clear(); params << "Manufacturer" << "DeviceName" << "Description" << "Location" << "DeviceClass"; - wmi = wmiSearch("Win32_PnPSignedDriver", params); - if (!wmi.isNull()) - hardware["PnPSignedDriver"] = wmi; + wmiResult = wmi::wmiSearch("Win32_PnPSignedDriver", params); + if (!wmiResult.isNull()) + hardware["PnPSignedDriver"] = wmiResult; // qDebug() << hardware; return hardware; } -QJsonValue cacic_hardware::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("}"); - jList.append(valueList.trimmed()); - } - itemWmi[tag] = jList; - } else { - //O último valor sempre volta com "}" no final. - if (aux.contains("}")) - aux.remove("}"); - 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; -} #elif defined(Q_OS_LINUX) QJsonObject cacic_hardware::coletaLinux() { diff --git a/src/cacic_hardware.h b/src/cacic_hardware.h index da43912..731d629 100644 --- a/src/cacic_hardware.h +++ b/src/cacic_hardware.h @@ -8,8 +8,7 @@ #include #include #ifdef Q_OS_WIN - #include - #include + #include #endif class cacic_hardware @@ -22,7 +21,6 @@ public: private: #ifdef Q_OS_WIN QJsonObject coletaWin(); - QJsonValue wmiSearch(QString classe, QStringList params); #elif defined(Q_OS_LINUX) QJsonObject coletaLinux(); diff --git a/src/cacic_software.h b/src/cacic_software.h index e80835e..a3297f0 100644 --- a/src/cacic_software.h +++ b/src/cacic_software.h @@ -4,7 +4,6 @@ #include #include #include - #ifdef Q_OS_WIN #include #include diff --git a/src/operatingsystem.cpp b/src/operatingsystem.cpp index 7bbd952..3a4c2fb 100644 --- a/src/operatingsystem.cpp +++ b/src/operatingsystem.cpp @@ -45,16 +45,15 @@ int OperatingSystem::coletaIdOs(){ QString OperatingSystem::coletaNomeOs() { #if defined(Q_OS_WIN) - QString text; - QStringList environment = QProcessEnvironment::systemEnvironment().toStringList(); - foreach (text, environment) { -// qDebug() << text; - if (text.contains("OS=" , Qt::CaseInsensitive) ){ - QStringList split = text.split("="); - // qDebug() << split[1]; - return split[1]; - } - } + QStringList params; + QJsonValue osName; + params << "Name"; + osName = wmi::wmiSearch("Win32_OperatingSystem", params); + if (!osName.isNull()){ + QString retorno = osName.toObject()["Name"].toString(); + retorno = retorno.left(retorno.indexOf("|")); + return retorno; + } #elif defined(Q_OS_LINUX) ConsoleObject console; QStringList catOutput = console("cat /etc/*release").split("\n"); diff --git a/src/operatingsystem.h b/src/operatingsystem.h index d72f047..1c02580 100644 --- a/src/operatingsystem.h +++ b/src/operatingsystem.h @@ -5,9 +5,11 @@ #include #include #include - #include "ccacic.h" #include "console.h" +#ifdef Q_OS_WIN + #include "wmi.h" +#endif class OperatingSystem { diff --git a/src/qtservice/common.pri b/src/qtservice/common.pri index 208921b..d848753 100644 --- a/src/qtservice/common.pri +++ b/src/qtservice/common.pri @@ -1,4 +1,4 @@ -exists(config.pri):infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtservice-uselib +#exists(config.pri):infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtservice-uselib TEMPLATE += fakelib QTSERVICE_LIBNAME = QtSolutions_Service-head CONFIG(debug, debug|release) { diff --git a/src/wmi.cpp b/src/wmi.cpp index 96798f3..8b89757 100644 --- a/src/wmi.cpp +++ b/src/wmi.cpp @@ -3,3 +3,94 @@ 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("}"); + jList.append(valueList.trimmed()); + } + itemWmi[tag] = jList; + } else { + //O último valor sempre volta com "}" no final. + if (aux.contains("}")) + aux.remove("}"); + 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; +} diff --git a/src/wmi.h b/src/wmi.h index ffb030b..a74e95f 100644 --- a/src/wmi.h +++ b/src/wmi.h @@ -1,10 +1,16 @@ #ifndef WMI_H #define WMI_H +#include +#include +#include + class wmi { public: wmi(); + static QJsonValue wmiSearch(QString classe, QStringList params); +private: }; #endif // WMI_H -- libgit2 0.21.2