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

本文介绍了一种使用WMI在Windows 7及以上系统中获取USB磁盘详细信息的方法,包括设备ID、型号及序列号等。文中提供了一个在VS2008环境下测试成功的示例代码。
    使用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上测试通过。
2025-10-28 09:50:35 [INFO] 修复版SMART数据应用程序初始化完成 - 版本 6.1 2025-10-28 09:50:35 [INFO] 界面初始化完成 2025-10-28 09:50:35 [INFO] 开始真实SMART数据扫描 2025-10-28 09:50:35 [INFO] 开始修复版磁盘扫描方法 2025-10-28 09:50:35 [INFO] 处理磁盘 1: Samsung SSD 980 PRO 2TB 2025-10-28 09:50:35 [INFO] WMI找到盘符: C: 对于磁盘 1 2025-10-28 09:50:36 [INFO] WMI找到盘符: D: 对于磁盘 1 2025-10-28 09:50:36 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 09:50:36 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 09:50:37 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 09:50:37 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 09:50:37 [INFO] 成功读取磁盘 1 的基本信息 2025-10-28 09:50:37 [INFO] 尝试获取磁盘 1 的SMART数据 2025-10-28 09:50:37 [ERROR] 传统方法DeviceIoControl失败,错误代码: 5 2025-10-28 09:50:37 [ERROR] ATA PASS THROUGH失败,错误代码: 50 2025-10-28 09:50:37 [INFO] 通过WMI获取基本SMART信息 2025-10-28 09:50:37 [INFO] WMI方法成功获取磁盘 1 的基本SMART信息 2025-10-28 09:50:37 [INFO] 添加有效磁盘: Samsung SSD 980 PRO 2TB (编号: 1) 2025-10-28 09:50:37 [INFO] 处理磁盘 0: ST4000DM004-2CV104 2025-10-28 09:50:37 [INFO] WMI找到盘符: E: 对于磁盘 0 2025-10-28 09:50:38 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 09:50:38 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 09:50:38 [INFO] 成功读取磁盘 0 的基本信息 2025-10-28 09:50:38 [INFO] 尝试获取磁盘 0 的SMART数据 2025-10-28 09:50:38 [ERROR] 传统方法DeviceIoControl失败,错误代码: 5 2025-10-28 09:50:38 [ERROR] ATA PASS THROUGH失败,错误代码: 87 2025-10-28 09:50:38 [INFO] 通过WMI获取基本SMART信息 2025-10-28 09:50:38 [INFO] WMI方法成功获取磁盘 0 的基本SMART信息 2025-10-28 09:50:38 [INFO] 添加有效磁盘: ST4000DM004-2CV104 (编号: 0) 2025-10-28 09:50:38 [INFO] 处理磁盘 2: Seagate Expansion SCSI Disk Device 2025-10-28 09:50:39 [INFO] WMI找到盘符: G: 对于磁盘 2 2025-10-28 09:50:39 [INFO] WMI找到盘符: H: 对于磁盘 2 2025-10-28 09:50:39 [INFO] WMI找到卷名: G:[SHINE] 对于磁盘 22025-10-28 09:50:48 [INFO] 用户选择磁盘 0 2025-10-28 09:50:49 [INFO] WMI找到盘符: E: 对于磁盘 0 2025-10-28 09:50:49 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 09:50:50 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 09:50:50 [INFO] 成功读取磁盘 0 的基本信息 2025-10-28 09:50:50 [INFO] 成功重新加载磁盘 0 的详细信息 2025-10-28 09:50:50 [INFO] 开始检测磁盘 0 的真实SMART健康状态 2025-10-28 09:50:50 [INFO] 磁盘 0 的真实SMART健康状态检测成功 2025-10-28 09:50:59 [INFO] 用户选择磁盘 1 2025-10-28 09:50:59 [INFO] WMI找到盘符: C: 对于磁盘 1 2025-10-28 09:50:59 [INFO] WMI找到盘符: D: 对于磁盘 1 2025-10-28 09:51:00 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 09:51:00 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 09:51:00 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 09:51:00 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 09:51:00 [INFO] 成功读取磁盘 1 的基本信息 2025-10-28 09:51:00 [INFO] 成功重新加载磁盘 1 的详细信息 2025-10-28 09:51:00 [INFO] 开始检测磁盘 1 的真实SMART健康状态 2025-10-28 09:51:00 [INFO] 磁盘 1 的真实SMART健康状态检测成功 2025-10-28 09:50:39 [INFO] WMI找到卷名: H:[新加卷] 对于磁盘 2 2025-10-28 09:50:40 [INFO] WMI找到卷名: G:[SHINE] 对于磁盘 2 2025-10-28 09:50:40 [INFO] WMI找到卷名: H:[新加卷] 对于磁盘 2 2025-10-28 09:50:40 [INFO] 成功读取磁盘 2 的基本信息 2025-10-28 09:50:40 [INFO] 通过可移动属性检测到USB设备: Seagate Expansion SCSI Disk Device 2025-10-28 09:50:40 [INFO] 过滤USB设备: Seagate Expansion SCSI Disk Device (编号: 2) 2025-10-28 09:50:40 [INFO] 扫描完成: 2 个有效磁盘, 1 个USB设备, 0 个虚拟设备 2025-10-28 09:50:40 [INFO] SMART扫描完成,发现 2 个有效的物理磁盘 2025-10-28 10:05:58 [INFO] 纯真实SMART数据应用程序初始化完成 - 版本 6.2 2025-10-28 10:05:58 [INFO] 界面初始化完成 2025-10-28 10:05:58 [INFO] 开始真实SMART数据扫描 2025-10-28 10:05:58 [INFO] 开始纯真实SMART数据磁盘扫描 2025-10-28 10:05:58 [INFO] 处理磁盘 1: Samsung SSD 980 PRO 2TB 2025-10-28 10:05:59 [INFO] WMI找到盘符: C: 对于磁盘 1 2025-10-28 10:05:59 [INFO] WMI找到盘符: D: 对于磁盘 1 2025-10-28 10:05:59 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 10:05:59 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 10:06:00 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 10:06:00 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 10:06:00 [INFO] 成功读取磁盘 1 的基本信息 2025-10-28 10:06:00 [INFO] 尝试获取磁盘 1 的真实SMART数据 2025-10-28 10:06:00 [ERROR] 传统方法DeviceIoControl失败,错误代码: 50 2025-10-28 10:06:00 [WARN] 无法获取磁盘 1 的真实SMART数据 2025-10-28 10:06:00 [INFO] 添加有效磁盘: Samsung SSD 980 PRO 2TB (编号: 1) 2025-10-28 10:06:00 [INFO] 处理磁盘 0: ST4000DM004-2CV104 2025-10-28 10:06:00 [INFO] WMI找到盘符: E: 对于磁盘 0 2025-10-28 10:06:01 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 10:06:01 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 10:06:01 [INFO] 成功读取磁盘 0 的基本信息 2025-10-28 10:06:01 [INFO] 尝试获取磁盘 0 的真实SMART数据 2025-10-28 10:06:01 [ERROR] 传统方法DeviceIoControl失败,错误代码: 122 2025-10-28 10:06:01 [WARN] 无法获取磁盘 0 的真实SMART数据 2025-10-28 10:06:01 [INFO] 添加有效磁盘: ST4000DM004-2CV104 (编号: 0) 2025-10-28 10:06:01 [INFO] 处理磁盘 2: Seagate Expansion SCSI Disk Device 2025-10-28 10:06:02 [INFO] WMI找到盘符: G: 对于磁盘 2 2025-10-28 10:06:02 [INFO] WMI找到盘符: H: 对于磁盘 2 2025-10-28 10:06:02 [INFO] WMI找到卷名: G:[SHINE] 对于磁盘 2 2025-10-28 10:06:02 [INFO] WMI找到卷名: H:[新加卷] 对于磁盘 2 2025-10-28 10:06:03 [INFO] WMI找到卷名: G:[SHINE] 对于磁盘 2 2025-10-28 10:06:03 [INFO] WMI找到卷名: H:[新加卷] 对于磁盘 2 2025-10-28 10:06:03 [INFO] 成功读取磁盘 2 的基本信息 2025-10-28 10:06:03 [INFO] 通过可移动属性检测到USB设备: Seagate Expansion SCSI Disk Device 2025-10-28 10:06:03 [INFO] 过滤USB设备: Seagate Expansion SCSI Disk Device (编号: 2) 2025-10-28 10:06:03 [INFO] 扫描完成: 2 个有效磁盘, 1 个USB设备, 0 个虚拟设备 2025-10-28 10:06:03 [INFO] SMART扫描完成,发现 2 个有效的物理磁盘 2025-10-28 10:06:04 [INFO] 用户选择磁盘 1 2025-10-28 10:06:05 [INFO] WMI找到盘符: C: 对于磁盘 1 2025-10-28 10:06:05 [INFO] WMI找到盘符: D: 对于磁盘 1 2025-10-28 10:06:05 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 10:06:05 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 10:06:06 [INFO] WMI找到卷名: C:[无卷名] 对于磁盘 1 2025-10-28 10:06:06 [INFO] WMI找到卷名: D:[无卷名] 对于磁盘 1 2025-10-28 10:06:06 [INFO] 成功读取磁盘 1 的基本信息 2025-10-28 10:06:06 [INFO] 成功重新加载磁盘 1 的详细信息 2025-10-28 10:06:06 [INFO] 开始检测磁盘 1 的真实SMART健康状态 2025-10-28 10:06:06 [WARN] 无法获取磁盘 1 的真实SMART数据 2025-10-28 10:06:12 [INFO] 用户选择磁盘 0 2025-10-28 10:06:13 [INFO] WMI找到盘符: E: 对于磁盘 0 2025-10-28 10:06:13 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 10:06:13 [INFO] WMI找到卷名: E:[新加卷] 对于磁盘 0 2025-10-28 10:06:13 [INFO] 成功读取磁盘 0 的基本信息 2025-10-28 10:06:13 [INFO] 成功重新加载磁盘 0 的详细信息 2025-10-28 10:06:13 [INFO] 开始检测磁盘 0 的真实SMART健康状态 2025-10-28 10:06:13 [WARN] 无法获取磁盘 0 的真实SMART数据 VB6开发
10-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值