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

本文介绍了一种使用C++从本地计算机获取WMI数据的方法。通过详细步骤演示了如何初始化COM组件、设置安全级别、连接WMI服务,并具体展示了查询操作系统名称的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值