您的位置:首页 > 其它

How to retrieve DELL Computer Service Tag by WMI programming

2007-03-04 21:19 369 查看
To accomplish my system administration task at work. I've wrote a WMI helper class to retrieve some system information (by modifying the MSDN sample code). The following code shows how to retrieve Service Tag from a Dell computer by using the simple WMI class.


Sample:


#include "wimhelper.h"




myWMI wmiobj;


BOOL bRet = wmiobj.Initialize();


CString strRet = wmiobj.WMIQuery(L"SerialNumber",L"Win32_BIOS");








/**////////////////////////////////////////////////////////////////


//Filename wmihelper.h


#pragma once




#include "wbemidl.h"


#include <comdef.h>




# pragma comment(lib, "wbemuuid.lib")




class myWMI




...{


private:


IWbemLocator *m_pLoc;


IWbemServices *m_pSvc;


public:


CString m_strErrorMsg;


public:


myWMI(void);


~myWMI(void);


BOOL Initialize(void);


CString WMIQuery(WCHAR* wsztrPropName ,WCHAR* wszNameSpace);




};




/**////////////////////////////////////


//Filename wmihelper.cpp


#include "StdAfx.h"


#include ".winadminapi.h"




myWMI::myWMI(void)




...{


m_pLoc = NULL;


m_pSvc = NULL;


}




myWMI::~myWMI(void)




...{


if(m_pSvc)


m_pSvc->Release();


if(m_pLoc)


m_pLoc->Release();


CoUninitialize();


}




BOOL myWMI::Initialize()




...{




HRESULT hres;


//Step1: initialize COM


hres = CoInitializeEx(0, COINIT_MULTITHREADED);


if(hres != S_OK )




...{


m_strErrorMsg.Format("Failed to initialize COM library. Error code: %d",hres);


return FALSE;


}


// Step 2: --------------------------------------------------


// Set general COM security levels --------------------------


// Note: If you are using Windows 2000, you need to specify -


// the default authentication credentials for a user by using


// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----


// parameter of CoInitializeSecurity ------------------------


hres = CoInitializeSecurity(


NULL,


-1, // COM authentication


NULL, // Authentication services


NULL, // Reserved


RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication


RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation


NULL, // Authentication info


EOAC_NONE, // Additional capabilities


NULL // Reserved


);


if(hres != S_OK)




...{


m_strErrorMsg.Format("Failed to initialize security. Error code: %d",hres);


return FALSE;


}




// Step 3: ---------------------------------------------------


// Obtain the initial locator to WMI -------------------------




hres = CoCreateInstance(


CLSID_WbemLocator,


0,


CLSCTX_INPROC_SERVER,


IID_IWbemLocator, (LPVOID *) &m_pLoc);


if(hres != S_OK)




...{


m_strErrorMsg.Format("Failed to create IWbemLocator object. Error code: %d",hres);


return FALSE;


}




// Step 4: -----------------------------------------------------


// Connect to WMI through the IWbemLocator::ConnectServer method






// Connect to the rootcimv2 namespace with


// the current user and obtain pointer m_pSvc


// to make IWbemServices calls.


hres = m_pLoc->ConnectServer(


_bstr_t(L"ROOT/CIMV2"), // Object path of WMI namespace


NULL, // User name. NULL = current user


NULL, // User password. NULL = current


0, // Locale. NULL indicates current


NULL, // Security flags.


0, // Authority (e.g. Kerberos)


0, // Context object


&m_pSvc // pointer to IWbemServices proxy


);


if (hres != S_OK)




...{


m_strErrorMsg.Format("Could not connect. Error code = %d",hres);


return FALSE; // Program has failed.


}


m_strErrorMsg.Format("Connected to ROOT/CIMV2 WMI namespace" );




return TRUE; //Initialization successfully completed.




}




CString myWMI::WMIQuery(WCHAR* wszPropName ,WCHAR* wszNameSpace)




...{


// Step 6: --------------------------------------------------


// Use the IWbemServices pointer to make requests of WMI ----




HRESULT hres;


IEnumWbemClassObject* pEnumerator = NULL;


bstr_t bstrQuery("SELECT * FROM ");


bstrQuery += wszNameSpace;


hres = m_pSvc->ExecQuery(


bstr_t("WQL"),


bstrQuery,


WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,


NULL,


&pEnumerator);




if (hres != S_OK)




...{


m_strErrorMsg.Format("Query for operating system name failed.Error code = %d",hres);


return FALSE; // Program has failed.


}


// Step 7: -------------------------------------------------


// Get the data from the query in step 6 -------------------




IWbemClassObject *pclsObj;


ULONG uReturn = 0;


CString strResult;




while (pEnumerator)




...{


HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);




if(0 == uReturn)




...{


break;


}




VARIANT vtProp;


VariantInit(&vtProp);




// Get the value of the Name property


hr = pclsObj->Get(wszPropName, 0, &vtProp, 0, 0); //bob.liu


_bstr_t bstrValue = &vtProp;


strResult = (char*)bstrValue;


VariantClear(&vtProp);


}




// Cleanup


// ========


pEnumerator->Release();


pclsObj->Release();


//CoUninitialize();


return strResult;


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: