Erkennung des Kombatibilitätsmodus
-
Hallo,
wie schon in dem letzten Thread zu GetVersionEx beschrieben haben wir nun herausgefunden das derjenige wo diese Funktion fehl schlug den Kombatibilitätsmodus verwendet hat. Statt Version 6.1 von Windows wurde 5.1 angezeigt. (Rechte Maustaste auf die EXE und Kombatibilität)
Nun meine Frage, wie kann man dies wiederum erkennen das man in einem solchen Modus daherkommt?
z.B. die WMI: http://www.c-plusplus.net/forum/236208
Allerdings auf was schaue ich hier? Suche nach Strings?Grüße
TheNoName
-
Du kannst doch via WMI die Version auslesen... Entweder die "Buildnumber" (6001) oder "Version" (6.0.6001)
-
Kannst du mir erstmal etwas weiterhelfen welcher Code der "beste" zum Auslesen von WMI ist. Ich habe hier einige Codeproject Projekte die nicht mit den Securitys zurechtkommen. Sollte halt universal funzen z.B. Win2000 und aufwärts.
Wenn der Version String dann genormt ist kann ich ihn in minour und mayor zerlegen.
-
Fragen wir mal so: Warum willst Du das überhaupt wissen?
-
Wie oben beschrieben, GetVersionEx kann manipuliert werden. Entweder ich kann den Kombatibilitätsmodus verhindern oder ich checke es selbst ab und vergleich die beiden.
-
Ich hab noch nie eine Anwendung geschrieben, wo mich GetVersionEx interessiert hat...
-
Eben daher will ich ja wissen wie man WMI sauber ausliesst.
Mein Ansatz:
CString CTestDlg::GetVersionWMI() { CString versionstring="error"; CoInitialize(NULL); //Security needs to be initialized in XP first and this was the major problem //why it was not working in XP. HRESULT result=CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_PKT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,0); if(result != S_OK && result != RPC_E_TOO_LATE){return versionstring;} IWbemLocator * pIWbemLocator = NULL; IWbemServices * pWbemServices = NULL; IEnumWbemClassObject * pEnumObject = NULL; BSTR bstrNamespace = (L"root\\cimv2"); if(CoCreateInstance (CLSID_WbemAdministrativeLocator,NULL,CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,IID_IUnknown ,( void ** ) & pIWbemLocator) != S_OK){return versionstring;} if(pIWbemLocator->ConnectServer(bstrNamespace,NULL,NULL,NULL,0,NULL,NULL,&pWbemServices) != S_OK){return versionstring;} HRESULT hRes; BSTR strQuery = (L"Select * from Win32_OperatingSystem"); BSTR strQL = (L"WQL"); hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(hRes == S_OK) { VARIANT v; BSTR strClassProp = SysAllocString(L"Version"); hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0); if(hRes == S_OK) { _bstr_t bstrPath = &v; //Just to convert BSTR to ANSI char* strPath=(char*)bstrPath; versionstring=strPath; VariantClear( &v ); } SysFreeString(strClassProp); } pClassObject->Release(); } } pIWbemLocator->Release(); pWbemServices->Release(); pEnumObject->Release(); CoUninitialize(); return versionstring; }
Aber ich habe mir sagen lassen das geht nicht in Win2000.
Solte man nicht statt select * gleich nach Version suchen?
Und was ist das cimv2?
-
Also ich benutze GetFileVersionInfo mit der ntdll.dll.