Indian Ocean

Hi,
I found some code from codeproject site using WMI in VC++.

I have created a method having the following code in it. It works fine when
I am running into "Admin" accound in Windows XP Pro while in "Restricted
user account", its not able to run. It's giving error messsage "Could not
enumerate" so it seems "pEnumObject" seems null or empty.
Please help,

Thanks in advance,

Code Snippet

CoInitialize(NULL);
//Security needs to be initialized in XP first and this was the major
problem
//why it was not working in XP.
if(CoInitializeSecurity( NULL,
-1,

NULL,

NULL,

RPC_C_AUTHN_LEVEL_PKT,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL,

EOAC_NONE,

0

) != S_OK)

return;


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;

if(pIWbemLocator->ConnectServer(

bstrNamespace, // Namespace

NULL, // Userid

NULL, // PW

NULL, // Locale

0, // flags

NULL, // Authority

NULL, // Context

&pWbemServices

) != S_OK)

return;




HRESULT hRes;

// BSTR strQuery = (L"Select * from Win32_PhysicalMedia");

BSTR strQuery = (L"Select * from Win32_PhysicalMedia");

BSTR strQL = (L"WQL");

hRes = pWbemServices->ExecQuery(strQL,
strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);


if(hRes != S_OK)

{

MessageBox("Could not execute Query");

return;

}

ULONG uCount = 1, uReturned;

IWbemClassObject * pClassObject = NULL;



hRes = pEnumObject->Reset();

if(hRes != S_OK)

{

MessageBox("Could not Enumerate");

return;

}

hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);

if(hRes != S_OK)

{

MessageBox("Could not Enumerate");

return;

}

VARIANT v;

//BSTR strClassProp = SysAllocString(L"SerialNumber");

//Product

BSTR strClassProp = SysAllocString(L"SerialNumber");

hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);

if(hRes != S_OK)

{

MessageBox("Could not Get Value");

return;

}

SysFreeString(strClassProp);


_bstr_t bstrPath = &v; //Just to convert BSTR to ANSI

char* strPath=(char*)bstrPath;



if (SUCCEEDED(hRes))

{

VariantClear( &v );

pIWbemLocator->Release();

pWbemServices->Release();

pEnumObject->Release();

pClassObject->Release();

CoUninitialize();

return strPath;

}

else

{

MessageBox("Error in getting object");

return;

}

VariantClear( &v );

pIWbemLocator->Release();

pWbemServices->Release();

pEnumObject->Release();

pClassObject->Release();

CoUninitialize();

return;







Re: Visual C++ General VC++ security problem using WMI

Bruno van Dooren

Have you checked that a non-administrator is allowed to enumerate physical devices via WMI

If that is not allowed, there is nothing you can do about it.

Since the program is running fine in admin mode, I think you should ask in a platform forum or in a security forum because this problem has nothing to do with VC++.





Re: Visual C++ General VC++ security problem using WMI

Indian Ocean

Hi,

Thanks for the reply,

Bruno van Dooren wrote:

Have you checked that a non-administrator is allowed to enumerate physical devices via WMI

Can you please tell me that how i can do this

The error shows that its not able to enumerate but still if i want to confirm it then is there any way






Re: Visual C++ General VC++ security problem using WMI

Bruno van Dooren

Well, the documentation of the interface you use for enumeration should mention something about this.

If you can't find anything in the WMI documentation, try asking in one of these forums

http://forums.microsoft.com/MSDN/default.aspx ForumGroupID=24&SiteID=1

or in one of the nntp platform newsgroups on msnews.microsoft.com