我有一个用C ++编码的Windows程序。要获取计算机驱动器的驱动器序列号,我使用_popen()在程序中运行“wmic path win32_physicalmedia get SerialNumber”。
但是,运行该程序的计算机可能有许多驱动器,并且USB驱动器也会出现在列表中。
如何知道哪个驱动器有我正在运行的程序?谢谢!
答案 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_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的情况下这样做,那么它的一点点会更棘手。
CreateFile()
打开驱动器并获取DeviceIoControl()
发送S.M.A.R.T的信息。命令。不要以为它总是那么容易:有很多驱动器,它会失败,你需要管理权。不幸的是,没有一个完美的解决方案,你需要尝试不同的方法。 AFAIK最好和最详尽的代码来处理这个问题是由Lynn McGuire编写的DiskId32实用程序。