You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
6.5 KiB
191 lines
6.5 KiB
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <objbase.h>
|
|
#include <wbemcli.h>
|
|
|
|
|
|
|
|
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"<CLASS NAME=\"abc\"><PROPERTY NAME=\"__PATH\" TYPE=\"string\"><VALUE>\\\\CALVINIDS\\root\\DEFAULT:abc</VALUE></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__NAMESPACE\" TYPE=\"string\"><VALUE>root\\DEFAULT</VALUE></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__SERVER\" TYPE=\"string\"><VALUE>CALVINIDS</VALUE></PROPERTY><PROPERTY.ARRAY NAME=\"__DERIVATION\" TYPE=\"string\"><VALUE.ARRAY></VALUE.ARRAY></PROPERTY.ARRAY>"
|
|
L"<PROPERTY NAME=\"__PROPERTY_COUNT\" TYPE=\"sint32\"><VALUE>1</VALUE></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__RELPATH\" TYPE=\"string\"><VALUE>abc</VALUE></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__DYNASTY\" TYPE=\"string\"><VALUE>abc</VALUE></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__SUPERCLASS\" TYPE=\"string\"></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__CLASS\" TYPE=\"string\"><VALUE>abc</VALUE></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__GENUS\" TYPE=\"sint32\"><VALUE>1</VALUE></PROPERTY>"
|
|
L"<PROPERTY.ARRAY NAME=\"__SECURITY_DESCRIPTOR\" TYPE=\"uint8\"></PROPERTY.ARRAY>"
|
|
L"<PROPERTY NAME=\"__TCREATED\" TYPE=\"uint64\"></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__TEXPIRATION\" TYPE=\"uint64\"></PROPERTY>"
|
|
L"<PROPERTY NAME=\"__TMODIFIED\" TYPE=\"uint64\"></PROPERTY>"
|
|
L"<PROPERTY NAME=\"ssad\" TYPE=\"string\"></PROPERTY></CLASS>");
|
|
|
|
IWbemClassObject *pNewObj = NULL;
|
|
/* strText = SysAllocString(L"<INSTANCE CLASSNAME=\"BLUESCREEN\">"\
|
|
L"<PROPERTY NAME=\"STOPCODE\" TYPE=\"string\"><VALUE>e2</VALUE></PROPERTY>"\
|
|
L"<PROPERTY.ARRAY NAME=\"IPADDRESS\" TYPE=\"string\">"\
|
|
L"<VALUE.ARRAY>"\
|
|
L"<VALUE>\"192.168.0.10\"</VALUE>"\
|
|
L"</VALUE.ARRAY>"\
|
|
L"</PROPERTY.ARRAY>"\
|
|
L"</INSTANCE>");*/
|
|
// strText = SysAllocString(L"<CLASS NAME='test'><PROPERTY></PROPERTY></CLASS>");
|
|
|
|
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;
|
|
}
|
|
|