WMI 例子

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <WbemIdl.h>
#pragma comment(lib,"wbemuuid.lib")



int main()
{
	HRESULT hr;

	// initialize com library
	hr = CoInitializeEx(0, COINIT_MULTITHREADED); 
	if (FAILED(hr)) 
	{ cout << "Failed to initialize COM library. Error code = 0x"
	<< hex << hr << endl; 
	return hr;
	}

	// initialize com security
	hr =  CoInitializeSecurity(
		NULL,                      // Security descriptor    
		-1,                        // COM negotiates authentication service
		NULL,                      // Authentication services
		NULL,                      // Reserved
		RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level for proxies
		RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation level for proxies
		NULL,                        // Authentication info
		EOAC_NONE,                   // Additional capabilities of the client or server
		NULL);                       // Reserved

	if (FAILED(hr))
	{
		cout << "Failed to initialize security. Error code = 0x" 
			<< hex << hr << endl;
		CoUninitialize();
		return hr;                  // Program has failed.
	}

	// initialize WMI IWbemLocator interface.
	IWbemLocator *pLoc = 0;

	hr = CoCreateInstance(CLSID_WbemLocator, 0, 
		CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

	if (FAILED(hr))
	{
		cout << "Failed to create IWbemLocator object. Err code = 0x"
			<< hex << hr << endl;
		CoUninitialize();
		return hr;     // Program has failed.
	}

	//connect to WMI server.
	IWbemServices *pSvc = 0;

	// Connect to the root\default namespace with the current user.
	hr = pLoc->ConnectServer(
		BSTR(L"root\\cimv2"), 
		NULL, NULL, 0, NULL, 0, 0, &pSvc);

	if (FAILED(hr))
	{
		cout << "Could not connect. Error code = 0x" 
			<< hex << hr << endl;
		pLoc->Release();
		CoUninitialize();
		return hr;      // Program has failed.
	}

	cout << "Connected to WMI" << endl;



	// Set the proxy so that impersonation of the client occurs.
	hr = CoSetProxyBlanket(pSvc,
		RPC_C_AUTHN_WINNT,
		RPC_C_AUTHZ_NONE,
		NULL,
		RPC_C_AUTHN_LEVEL_CALL,
		RPC_C_IMP_LEVEL_IMPERSONATE,
		NULL,
		EOAC_NONE
		);

	if (FAILED(hr))
	{
		cout << "Could not set proxy blanket. Error code = 0x" 
			<< hex << hr << endl;
		pSvc->Release();
		pLoc->Release();     
		CoUninitialize();
		return hr;      // Program has failed.
	}

	IEnumWbemClassObject* ppEnum;

	hr = pSvc->ExecQuery(
		bstr_t("WQL"),
		bstr_t("SELECT * FROM Win32_BIOS"),
		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
		NULL,
		&ppEnum
		);
	if (FAILED(hr))
	{
		if (pSvc)pSvc->Release();
		if (pLoc)pLoc->Release();
		CoUninitialize();
		return 0;
	}

	IWbemClassObject* ppObjects=NULL;
	ULONG uReturn=0;
	while (ppEnum)
	{
		hr = ppEnum->Next(
			WBEM_INFINITE, 
			1, 
			&ppObjects, 
			&uReturn
			);


		if (0==uReturn)	break;
		VARIANT vtProp;
		hr = ppObjects->Get(L"Name",0,&vtProp,0,0);
		wcout<<"Manufacture Name:"<<_com_util::ConvertBSTRToString(vtProp.bstrVal)<<endl;

		hr = ppObjects->Get(L"Manufacturer",0,&vtProp,0,0);
		wcout<<"Manufacture Name:"<<_com_util::ConvertBSTRToString(vtProp.bstrVal)<<endl;
		VariantClear(&vtProp);
	}

	pSvc->Release();
	pLoc->Release();
	CoUninitialize();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值