假设您仍然想使用 WMI:首先您需要一些代码来读取 C++ 中的 WMI 属性。此处无需赘述,您可以在Getting CPU ID code from C# to be in C++找到。
当您拥有该代码时,您可以统计使用磁盘。首先你需要记住 Windows 是如何组织磁盘的:
- 每个物理磁盘 (
Win32_DiskDrive) 由分区 (Win32_DiskPartition) 组成。
- 每个分区 (
Win32_DiskPartition) 都是一个逻辑磁盘 (Win32_LogicalDisk)。
- 彼此之间的映射是通过
Win32_DiskDriveToDiskPartition 和Win32_LogicalDiskToPartition 完成的。
你已经知道where you're running那么你可以做这个映射:
从Win32_LogicalDisk 获取DeviceID 属性与您正在运行的驱动器匹配的位置:
DeviceID=C:
查询Win32_LogicalDiskToPartition 并选择Antecedent 的Dependent 具有您之前找到的ID:
\\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1" \\REPETTI\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
现在您应该查询Win32_DiskPartition 中的分区以找到DeviceID 为Disk #1, Partition #1 的分区,但Win32_DiskDriveToDiskPartition 也使用DeviceID 进行此映射,然后您可以直接查询Win32_DiskDriveToDiskPartition 以匹配给定的ID:
\\REPETTI\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1" \\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"
现在您只需查询Win32_DiskDrive 搜索设备ID \\.\PHYSICALDRIVE1:
WDC WDxxx ATA Device \\.\PHYSICALDRIVE1 WDC WDxxx ATA Device
您可以获取它的序列号(在这种情况下,Win32_PhysicalMedia 和 Win32_DiskDrive 都提供相同的属性,否则您应该通过它的 Caption 搜索)。
没有 WMI
如果您必须在没有 WMI 的情况下执行此操作,那么它有点更加棘手。
- 首先你需要弄清楚哪个物理驱动器包含你的逻辑驱动器_你可以关注How to list physical disks?。
- 当您拥有物理驱动器名称时,最简单的方法是
CreateFile() 打开驱动器并通过 DeviceIoControl() 发送 S.M.A.R.T. 获取信息。命令。不要认为它总是那么容易:有很多驱动器它会失败,你需要管理权限。不幸的是,没有一个完美的解决方案,那么您需要尝试不同的方法。 Lynn McGuire 为其 DiskId32 实用程序编写了 AFAIK 处理此问题的最佳和最详尽的代码。