WMI für alle xD
-
Hallo,
da viele leute mit WMI machen habe ich eine kleine Funktion geschrieben
vielleicht benötigt diese irgend jemandstring GetWMIValue(char* type,wchar_t *value) { string ReturnValue = "(null)"; HRESULT hResult; hResult = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hResult)) { ReturnValue = "Error at CoInitializeEx"; return ReturnValue; } hResult = CoInitializeSecurity(NULL, -1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); if(FAILED(hResult)) { ReturnValue = "Error at CoInitializeSecurity"; CoUninitialize(); return ReturnValue; } IWbemLocator *pLoc = NULL; hResult = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *)&pLoc); if(FAILED(hResult)) { CoUninitialize(); ReturnValue = "Error at CoCreateInstance"; return ReturnValue; } IWbemServices *pSvc = NULL; hResult = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL,NULL,NULL,NULL,NULL,NULL,&pSvc); if(FAILED(hResult)) { ReturnValue = "Error at Connecting Server"; pLoc->Release(); CoUninitialize(); return ReturnValue; } hResult = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); if (FAILED(hResult)) { ReturnValue = "Error at CoSetProxyBlanket"; pSvc->Release(); pLoc->Release(); CoUninitialize(); return ReturnValue; } IEnumWbemClassObject* pEnumerator = NULL; hResult = pSvc->ExecQuery(bstr_t("WQL"),bstr_t(type),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator); if(FAILED(hResult)) { ReturnValue = "Error at ExecQuery"; pSvc->Release(); pLoc->Release(); CoUninitialize(); return ReturnValue; } IWbemClassObject *pclsObj; ULONG uReturn = 0; if(pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(uReturn) { _variant_t var_val; hr = pclsObj->Get(value, 0, &var_val, 0, 0); _bstr_t str = var_val; ReturnValue = (char*)str; VariantClear(&var_val); } else { ReturnValue = "Error at pEnumerator->Next"; } } pSvc->Release(); pLoc->Release(); pEnumerator->Release(); pclsObj->Release(); CoUninitialize(); // Wenn alles geklappt hat Wert zurück geben! return ReturnValue; }
Beispiel :
string W32ProzessorCaption = GetWMIValue("SELECT * FROM Win32_Processor",L"Caption"); cout << W32ProzessorCaption.c_str() << endl;
gebt auch bitte eine bewertung von 1-10 ab wie nützlich sie ist
1 = schlecht
10 = sehr gut
-
Hi, welche Header muss man einbinden, habe bisher die eingebunden:
#include <comdef.h>
#include <Wbemidl.h>doch ich bekomme noch 5 Fehler:
error C2065: 'COINIT_MULTITHREADED': nichtdeklarierter Bezeichner
error C3861: "CoInitializeEx": Bezeichner wurde nicht gefunden.
error C2065: 'EOAC_NONE': nichtdeklarierter Bezeichner
error C3861: "CoInitializeSecurity": Bezeichner wurde nicht gefunden.
error C3861: "CoSetProxyBlanket": Bezeichner wurde nicht gefunden.
-
#include <objbase.h>
-
Geht immer noch nicht, die gleichen Fehler
-
kernel64 schrieb:
Geht immer noch nicht, die gleichen Fehler
ganz oben über alle #includes noch:
#define _WIN32_WINNT 0x0500
-
#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#include <string.h>
#include <windows.h>
#include <tchar.h>
#include <objbase.h>
#include <atlbase.h>using namespace std;
#pragma comment(lib, "wbemuuid.lib")
is mein header
-
-
OK vielen Dank es klappt
Auf welcher Seite kann man alle Values anschauen, will auch paar Systeminfos rausbekommen
-
Welche Werte/Values kann man noch in GetWMIValue("SELECT * FROM Win32_Processor",L"Caption"); einsetzen, gibt es vielleicht eine Liste mit allen Befehlen
[EDIT] Habs gefunden: http://msdn2.microsoft.com/en-us/library/aa394084.aspx
Habe paar Infos zusammengestellt:
string W32ProzessorCaption; cout << "Betriebssystem:" << endl; W32ProzessorCaption = GetWMIValue("Select * from Win32_OperatingSystem",L"Caption"); cout << W32ProzessorCaption.c_str() << endl << endl; cout << "CPU Information:" << endl; W32ProzessorCaption = GetWMIValue("SELECT * FROM Win32_Processor",L"Name"); cout << W32ProzessorCaption.c_str() << endl; W32ProzessorCaption = GetWMIValue("SELECT * FROM Win32_Processor",L"Manufacturer"); cout << W32ProzessorCaption.c_str() << endl << endl; cout << "Festplatte:" << endl; W32ProzessorCaption = GetWMIValue("Select * from Win32_DiskDrive",L"Name"); cout << W32ProzessorCaption.c_str() << endl; W32ProzessorCaption = GetWMIValue("Select * from Win32_DiskDrive",L"Caption"); cout << W32ProzessorCaption.c_str() << endl;
Kann man auch andere Datentypen verwenden wenn kein String übergeben wird, z.b. BOOL W32ProzessorCaption = ...
Bekomme ich mit der Klasse Win32_DiskDrive alle Festplatten die auf dem Computer sind? Ich kanns bei meine Notebook nicht testen da nur eine Festplatte vorhanden ist.
-
kann man auch andere Datentypen verwenden wenn kein String übergeben wird, z.b. BOOL W32ProzessorCaption = ...
ja hier beispiel :
string W32WMI = GetWMIValue("SELECT * FROM Win32_Processor",L"PowerManagementSupported"); cout << "PowerManageMentSupported: " << W32WMI.c_str() << endl;
class Win32_Processor : CIM_Processor
{
uint16 AddressWidth;
uint16 Architecture;
uint16 Availability;
string Caption;
uint32 ConfigManagerErrorCode;
boolean ConfigManagerUserConfig;
uint16 CpuStatus;
string CreationClassName;
uint32 CurrentClockSpeed;
uint16 CurrentVoltage;
uint16 DataWidth;
string Description;
string DeviceID;
boolean ErrorCleared;
string ErrorDescription;
uint32 ExtClock;
uint16 Family;
datetime InstallDate;
uint32 L2CacheSize;
uint32 L2CacheSpeed;
uint32 L3CacheSize;
uint32 L3CacheSpeed;
uint32 LastErrorCode;
uint16 Level;
uint16 LoadPercentage;
string Manufacturer;
uint32 MaxClockSpeed;
string Name;
uint32 NumberOfCores;
uint32 NumberOfLogicalProcessors;
string OtherFamilyDescription;
string PNPDeviceID;
uint16 PowerManagementCapabilities[];
boolean PowerManagementSupported;
string ProcessorId;
uint16 ProcessorType;
uint16 Revision;
string Role;
string SocketDesignation;
string Status;
uint16 StatusInfo;
string Stepping;
string SystemCreationClassName;
string SystemName;
string UniqueId;
uint16 UpgradeMethod;
string Version;
uint32 VoltageCaps;
};/////////////////////////////////////////////
/////////////////////////////////////////////Bekomme ich mit der Klasse Win32_DiskDrive alle Festplatten die auf dem Computer sind? Ich kanns bei meine Notebook nicht testen da nur eine Festplatte vorhanden ist.
ja kannst du dazu schreibe ich dir morgen die GetWMIValue um damit du alle angezeigt bekommst ( wenn vorhanden )
im moment gibt es nur eine aus
-
ja kannst du dazu schreibe ich dir morgen die GetWMIValue um damit du alle angezeigt bekommst
Darauf warte ich schon
Will mit dem Code ein Tool schreiben welches als Parameter die Daten erhält, dann die Funktion GetWMIValue() startet und je nach Parameter den Wert ausgibt, nur bei mir wird nix ausgegeben wahrscheinlich ist der cast falsch hoffe ihr könnt weiterhelfen:
#define _WIN32_DCOM #include <iostream> #include <comdef.h> #include <Wbemidl.h> #include <string> #include <windows.h> #include <tchar.h> #include <objbase.h> #include <atlbase.h> #pragma comment(lib, "wbemuuid.lib") using namespace std; string GetWMIValue(char* type, wchar_t *value) { //... } int main(int argc, char* argv[]) { if(argc > 3) { string option = argv[1]; if(option == "get") { string getW32Value; string select = "SELECT * FROM "; string Klasse = argv[2]; string Inhalt = argv[3]; select += Klasse; getW32Value = GetWMIValue((char*)select.c_str(), (wchar_t*)Inhalt.c_str() ); cout << getW32Value << endl; } if(option == "set") { cout << "set..." << endl; } } else //Hier werden alle Möglichkeiten Ausgegeben return 0; }
Wie man sieht habe ich noch eine Option set eingebaut, wäre es möglich noch eine Funktion zu schreiben um Systemeinstellungen vorzunehmen, dann kann man das System auslesen & einstellen
-
Warum funktioniert nicht der dieser Code wenn ich per argc Parameter übergebe und dann an die Funktion übergebe?
if(option == "get") { string getW32Value; string select = "SELECT * FROM "; string Klasse = argv[2]; string Inhalt = argv[3]; select += Klasse; cout << Klasse << endl; cout << Inhalt << endl; // getW32Value = GetWMIValue("SELECT * FROM Win32_Processor", L"Name" ); // cout << "VALUE: " << getW32Value << endl; getW32Value = GetWMIValue((char*)select.c_str(), (wchar_t*)Inhalt.c_str() ); cout << "VALUE: " << getW32Value << endl; }
-
kernel64 schrieb:
Warum funktioniert nicht der dieser Code wenn ich per argc Parameter übergebe und dann an die Funktion übergebe?
'funktioniert nicht' ... ahja
.
getW32Value = GetWMIValue([b](char*)select.c_str(), (wchar_t*)Inhalt.c_str()[/b] );
Also wenn ich das sehe, bekomm ich Bauchschmerzen
; lass doch den armen Rückgabewert von c_str() auch als const char* (musst halt die Funktion anpassen!).