#include #include #include #include #include void FillUpContext(IWbemContext *pContext) { VARIANT vValue; // IncludeQualifiers VariantInit(&vValue); vValue.vt = VT_BOOL; vValue.boolVal = VARIANT_FALSE; pContext->SetValue(L"IncludeQualifiers", 0, &vValue); VariantClear(&vValue); // PathLevel // // pathLevelAnonymous = 0 // pathLevelNamed, // pathLevelLocal, // pathLevelFull VariantInit(&vValue); vValue.vt = VT_I4; vValue.lVal = 0; pContext->SetValue(L"PathLevel", 0, &vValue); VariantClear(&vValue); // ExcludeSystemProperties VariantInit(&vValue); vValue.vt = VT_BOOL; vValue.boolVal = VARIANT_TRUE; pContext->SetValue(L"ExcludeSystemProperties", 0, &vValue); VariantClear(&vValue); } int _cdecl main(int argc, char * argv[]) { if(FAILED(CoInitialize(NULL))) return 1; HRESULT hr = E_FAIL; IWbemObjectTextSrc *pSrc = NULL; IWbemLocator *pL = NULL; if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**) &pL))) { // Create a context object IWbemContext *pContext = NULL; if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemContext, NULL, CLSCTX_INPROC_SERVER, IID_IWbemContext, (void**) &pContext))) { FillUpContext(pContext); IWbemServices *pConnection = NULL; BSTR strNs = SysAllocString(L"root\\cimv2"); BSTR strText = NULL; if(SUCCEEDED(hr = pL->ConnectServer(strNs, NULL, NULL, NULL, 0, NULL, NULL, &pConnection))) { IWbemClassObject *pClass = NULL; //BSTR strObj = SysAllocString(L"MethCLass.KeyProp=\"abc\""); // BSTR strObj = SysAllocString(L"MethCLass"); BSTR strObj = SysAllocString(L"Win32_LogicalDisk"); if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemObjectTextSrc, NULL, CLSCTX_INPROC_SERVER, IID_IWbemObjectTextSrc, (void**) &pSrc))) { // Test for GetObject if(SUCCEEDED(hr = pConnection->GetObject(strObj, 0, NULL, &pClass, NULL))) { if(SUCCEEDED(hr = pSrc->GetText(0, pClass, WMI_OBJ_TEXT_CIM_DTD_2_0, pContext, &strText))) { printf("GETOBJECT SUCCEEDED\n"); printf("================================================\n"); wprintf(strText); } else printf("GetText failed with %x\n", hr); pClass->Release(); } else printf("GetObject failed with %x\n", hr); } else printf("CoCreateInstance on WbemObjectTextSrc failed with %x\n", hr); // Test for PutClass strText = SysAllocString( L"\\\\CALVINIDS\\root\\DEFAULT:abc" L"root\\DEFAULT" L"CALVINIDS" L"1" L"abc" L"abc" L"" L"abc" L"1" L"" L"" L"" L"" L""); IWbemClassObject *pNewObj = NULL; /* strText = SysAllocString(L""\ L"e2"\ L""\ L""\ L"\"192.168.0.10\""\ L""\ L""\ L"");*/ // strText = SysAllocString(L""); if(SUCCEEDED(hr = pSrc->CreateFromText(0, strText, WMI_OBJ_TEXT_CIM_DTD_2_0, NULL, &pNewObj))) { wprintf(L"\n\nCREATEFROMTEXT() SUCCEEDED FOR %s\n\n", strText); // Test to get the RELPATH VARIANT var; VariantInit(&var); if(FAILED(pNewObj->Get (L"__RELPATH", 0, &var, NULL, NULL))) exit(0); BSTR strXML = NULL; if(SUCCEEDED(hr = pSrc->GetText(0, pNewObj, WMI_OBJ_TEXT_WMI_DTD_2_0, NULL, &strXML))) { printf("PutClass Succeeded: Result is\n"); wprintf(strXML); } else printf("GetText on new class failed!\n"); } else printf("\n\nCREATEFROMTEXT() FAILED with %x\n\n", hr); // Test for ExecQuery //BSTR strQuery = SysAllocString(L"Select GroupName, Name, UserName from Win32_ProgramGroup"); BSTR strQuery = SysAllocString(L"Select * from Win32_ProgramGroup"); BSTR strQueryLang = SysAllocString(L"WQL"); IEnumWbemClassObject *pEnum = NULL; if(FAILED(hr = CoSetProxyBlanket(pConnection, RPC_C_AUTHN_DEFAULT, RPC_C_AUTHZ_DEFAULT, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT))) { printf("Failed to set proxy blanket\n"); exit(1); } if(SUCCEEDED(hr = pConnection->ExecQuery(strQueryLang, strQuery, 0, NULL, &pEnum))) { IWbemClassObject *pNextObject = NULL; DWORD dwCount = 1; while(SUCCEEDED(pEnum->Next(WBEM_INFINITE , 1, &pNextObject, &dwCount)) && dwCount == 1) { BSTR strText = NULL; if(SUCCEEDED(hr = pSrc->GetText(0, pNextObject, WMI_OBJ_TEXT_WMI_DTD_2_0, pContext, &strText))) { printf("EXECQUERY SUCCEEDED\n"); printf("================================================\n"); wprintf(strText); SysFreeString(strText); } else printf("GetText failed with %x\n", hr); pNextObject->Release(); } pEnum->Release(); } else printf("ExecQuery failed with %x\n", hr); } else printf("ConnectServer on root\\cimv2 failed with %x\n", hr); } } else printf("CoCreateInstance on Locator failed with %x\n", hr); return 0; }