Win7下使用WMI获取移动磁盘序列号

    使用WMI方式来获取移动磁盘序列号仅支持Vista及以上系统。网上有些资料显示,在XP系统下能够使用WMI获取序列号,我反正试过了都不行。后来在https://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx证实了这一点!废话少说,直接上代码:
#include <WbemIdl.h>
#include <comdef.h>
#pragma comment(lib,"WbemUuid.lib")

HRESULT GetSerialNumber(void)
{
	IWbemServices* pWbemSvc = NULL;
	IWbemLocator* pWbemLoc	= NULL;
	HRESULT hRes;
	
	hRes = CoInitializeEx(0, COINIT_MULTITHREADED);
	if (FAILED(hRes))
	{
		OutputDebugStr(_T("Failed to initialize COM library!"));
		return hRes;
	}
	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) && RPC_E_TOO_LATE != hRes)
	{
		OutputDebugStr(_T("Failed to initialize security!"));
		return hRes;
	}
	hRes = CoCreateInstance(CLSID_WbemLocator, 0, \
		CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pWbemLoc);
	if (FAILED(hRes))
	{
		OutputDebugStr(_T("Failed to create IWbemLocator object!"));
		CoUninitialize();
		return hRes;
	}
	hRes = pWbemLoc->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 
		&pWbemSvc                // pointer to IWbemServices proxy
		);
	if (FAILED(hRes))
	{
		OutputDebugStr(_T("Could not connect!"));
		pWbemLoc->Release();     
		CoUninitialize();
		return hRes;
	}
	hRes = CoSetProxyBlanket(
		pWbemSvc,                    // 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))
	{
		OutputDebugStr(_T("Could not set proxy blanket!"));
		pWbemSvc->Release();
		pWbemLoc->Release();     
		CoUninitialize();
		return hRes;
	}
	USES_CONVERSION;
	VARIANT vtProp;
	ULONG uRet = 0;
	IEnumWbemClassObject* pEnumClsObj = NULL;
	IWbemClassObject* pWbemClsObj = NULL;
	CComBSTR strQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
	hRes = pWbemSvc->ExecQuery(CComBSTR("WQL"), strQuery, \
		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, \
		0, &pEnumClsObj);
	if (FAILED(hRes))
	{
		OutputDebugStr(_T("Failed to ExecQuery!"));
		if (pEnumClsObj != NULL)
		{
			pEnumClsObj->Release();
		}
		pWbemSvc->Release();
		pWbemLoc->Release();     
		CoUninitialize();
		return hRes;  
	}
	VariantInit(&vtProp);
	CStringArray strArray1;
	CStringArray strArray2;
	CStringArray strArray3;
	while (SUCCEEDED(pEnumClsObj->Next(WBEM_INFINITE, 1, &pWbemClsObj, &uRet)))
	{
		if (uRet <= 0)
		{
			break;
		}
		//获取物理磁盘号:\\.\PHYSICALDRIVE0
		hRes = pWbemClsObj->Get(CComBSTR(_T("DeviceID")), 0, &vtProp, 0, 0);
		strArray1.Add(AnalizeVariant(&vtProp));
		VariantClear(&vtProp);

		//获取磁盘名称
		hRes = pWbemClsObj->Get(CComBSTR(_T("Model")), 0, &vtProp, 0, 0);
		strArray2.Add(AnalizeVariant(&vtProp));
		VariantClear(&vtProp);

		//获取磁盘序列号
		hRes = pWbemClsObj->Get(CComBSTR(_T("SerialNumber")), 0, &vtProp, 0, 0);
		strArray3.Add(AnalizeVariant(&vtProp));				
		VariantClear(&vtProp);        
	}
	VariantClear(&vtProp);
	if (pEnumClsObj != NULL)
	{
		pEnumClsObj->Release();
		pEnumClsObj = NULL;
	}
	if (pWbemClsObj != NULL)
	{
		pWbemClsObj->Release();
		pWbemClsObj = NULL;
	}
	pWbemSvc->Release();
	pWbemLoc->Release();
	CoUninitialize();

	return S_OK;
}
    以上代码已在Win7 + VS 2008上测试通过。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值