识别Windows上程序的驱动器

时间:2015-10-05 14:22:27

标签: c++ wmic serial-number

我有一个用C ++编码的Windows程序。要获取计算机驱动器的驱动器序列号,我使用_popen()在程序中运行“wmic path win32_physicalmedia get SerialNumber”。

但是,运行该程序的计算机可能有许多驱动器,并且USB驱动器也会出现在列表中。

如何知道哪个驱动器有我正在运行的程序?谢谢!

1 个答案:

答案 0 :(得分:2)

假设您仍然希望使用WMI:首先,您需要一些代码来读取C ++中的WMI属性。无需在此重复,您可以在Getting CPU ID code from C# to be in C++中找到它。

当您拥有该代码时,您可以使用stat来处理磁盘。首先,您需要记住Windows如何组织磁盘:

  • 每个物理磁盘(Win32_DiskDrive)由分区(Win32_DiskPartition)生成。
  • 每个分区(Win32_DiskPartition)都是逻辑磁盘(Win32_LogicalDisk)。
  • 使用Win32_DiskDriveToDiskPartitionWin32_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中的分区,找到DeviceIDDisk #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_PhysicalMediaWin32_DiskDrive都可以使用相同的属性,否则您应该按其Caption进行搜索。

没有WMI

如果你必须在没有WMI的情况下这样做,那么它的一点点会更棘手。

  • 首先,您需要确定哪个物理驱动器包含您的逻辑驱动器_您可以关注How to list physical disks?
  • 当您拥有物理驱动器名称最简单的方法是CreateFile()打开驱动器并获取DeviceIoControl()发送S.M.A.R.T的信息。命令。不要以为它总是那么容易:有很多驱动器,它会失败,你需要管理权。不幸的是,没有一个完美的解决方案,你需要尝试不同的方法。 AFAIK最好和最详尽的代码来处理这个问题是由Lynn McGuire编写的DiskId32实用程序。