(C++)从本机获取WMI数据.

 下面的步骤被用于执行WMI程序. 第1步到第5步包含了建立和连接WMI的所有步骤。第6,7步用于数据查询和获取。
 
1. 通过调用CoInitialzeEx来初始化COM参数.

2. 通过调用CoInitializeSecurity来初始化COM过程安全.

3. 通过调用CoCreateInstance来实例化。

4. 通过调用IWbemLocator::ConnectServer来获取一个本机root\cimv2命名空间的IWbemServices的指针。

5. 设置IWbemServices代理安全,WMI service可以通过调用CoSetProxyBlanket来模拟客户端。

6. 用IWbmeServices指针来查询WMI. 本例子通过调用IWbemServies::ExecQuery 来查询操作系统名称.
   SELEC * FROM Win32_OperatingSystem
  
7. 获取和现实WQL查询的数据. 

  1. VARIANT vtProp;  
  2.   
  3. // Get the value of the Name property  
  4. hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);  


环境说明:VS2012 + WIN8 64位 Console Application
完整代码:  

// GetWMIInfo.cpp : Defines the entry point for the console application. //   #include "stdafx.h"  #include <iostream>   using namespace std;   #include <comdef.h>   #include <Wbemidl.h>    # pragma comment(lib, "wbemuuid.lib")    int _tmain(int argc, _TCHAR* argv[]) { 	HRESULT hres;    	// Step 1: --------------------------------------------------   	// Initialize COM. ------------------------------------------    	hres =  CoInitializeEx(0, COINIT_MULTITHREADED);    	if (FAILED(hres))   	{   		cout << "Failed to initialize COM library. Error code = 0x"    			<< hex << hres << endl;   		return 1;                  // Program has failed.   	}    	// 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 (FAILED(hres))   	{   		cout << "Failed to initialize security. Error code = 0x"    			<< hex << hres << endl;   		CoUninitialize();   		return 1;                    // Program has failed.   	}    	// Step 3: ---------------------------------------------------   	// Obtain the initial locator to WMI -------------------------    	IWbemLocator *pLoc = NULL;    	hres = CoCreateInstance(   		CLSID_WbemLocator,                		0,    		CLSCTX_INPROC_SERVER,    		IID_IWbemLocator, (LPVOID *) &pLoc);    	if (FAILED(hres))   	{   		cout << "Failed to create IWbemLocator object."   			<< " Err code = 0x"   			<< hex << hres << endl;   		CoUninitialize();   		return 1;                 // Program has failed.   	}    	// Step 4: -----------------------------------------------------   	// Connect to WMI through the IWbemLocator::ConnectServer method    	IWbemServices *pSvc = NULL;    	// Connect to the root\cimv2 namespace with   	// the current user and obtain pointer pSvc   	// to make IWbemServices calls.   	hres = 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    		&pSvc                    // pointer to IWbemServices proxy   		);    	if (FAILED(hres))   	{   		cout << "Could not connect. Error code = 0x"    			<< hex << hres << endl;   		pLoc->Release();        		CoUninitialize();   		return 1;                // Program has failed.   	}    	cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;     	// Step 5: --------------------------------------------------   	// Set security levels on the proxy -------------------------    	hres = CoSetProxyBlanket(   		pSvc,                        // Indicates the proxy to set   		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx   		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx   		NULL,                        // Server principal name    		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx    		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx   		NULL,                        // client identity   		EOAC_NONE                    // proxy capabilities    		);    	if (FAILED(hres))   	{   		cout << "Could not set proxy blanket. Error code = 0x"    			<< hex << hres << endl;   		pSvc->Release();   		pLoc->Release();        		CoUninitialize();   		return 1;               // Program has failed.   	}    	// Step 6: --------------------------------------------------   	// Use the IWbemServices pointer to make requests of WMI ----    	// For example, get the name of the operating system   	IEnumWbemClassObject* pEnumerator = NULL;   	hres = pSvc->ExecQuery(   		bstr_t("WQL"),    		bstr_t("SELECT * FROM Win32_OperatingSystem"),   		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,    		NULL,   		&pEnumerator);    	if (FAILED(hres))   	{   		cout << "Query for operating system name failed."   			<< " Error code = 0x"    			<< hex << hres << endl;   		pSvc->Release();   		pLoc->Release();   		CoUninitialize();   		return 1;               // Program has failed.   	}    	// Step 7: -------------------------------------------------   	// Get the data from the query in step 6 -------------------    	IWbemClassObject *pclsObj = NULL;   	ULONG uReturn = 0;    	while (pEnumerator)   	{   		HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,    			&pclsObj, &uReturn);    		if(0 == uReturn)   		{   			break;   		}    		VARIANT vtProp;    		// Get the value of the Name property   		hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);   		wcout << " OS Name : " << vtProp.bstrVal << endl;   		VariantClear(&vtProp);    		pclsObj->Release();   	}    	// Cleanup   	// ========   	 	if (pclsObj!=NULL){ 		pclsObj->Release(); 	} 	if (pEnumerator!=NULL){ 		pEnumerator->Release(); 	} 	 	pSvc->Release(); 	pLoc->Release(); 	CoUninitialize();  	return 0;   // Program successfully completed.   } 

原文:http://msdn.microsoft.com/en-us/library/windows/desktop/aa390423(v=vs.85).aspx