识别Windows上程序的驱动器

Identify the drive of a program on Windows

本文关键字:驱动器 程序 Windows 识别      更新时间:2023-10-16

我有一个用c++编写的Windows程序。为了获得计算机驱动器的驱动器序列号,我在程序中使用_popen()运行"wmic path win32_physicalmedia get SerialNumber"。

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

我怎样才能知道哪个驱动器有我正在运行的程序?谢谢!

假设您仍然希望使用WMI:首先,您需要一些代码来读取c++中的WMI属性。这里不需要重复,你可以在从c#到c++的CPU ID代码中找到它。

当你有了这些代码,你就可以开始使用磁盘了。首先你需要记住Windows是如何组织磁盘的:

  • 每个物理磁盘(Win32_DiskDrive)由分区(Win32_DiskPartition)组成。
  • 每个分区(Win32_DiskPartition)为一个逻辑盘(Win32_LogicalDisk)。
  • 彼此之间的映射由Win32_DiskDriveToDiskPartitionWin32_LogicalDiskToPartition完成。

你已经知道你在哪里运行,然后你可以做这个映射:

Win32_LogicalDisk中获取DeviceID属性匹配的驱动器:

DeviceID=C:

查询Win32_LogicalDiskToPartition,选择Dependent有ID的Antecedent:

\REPETTIrootcimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"  \REPETTIrootcimv2:Win32_LogicalDisk.DeviceID="C:"

现在你应该查询Win32_DiskPartition中的分区,找到DeviceIDDisk #1, Partition #1的分区,但是Win32_DiskDriveToDiskPartition也使用DeviceID进行映射,然后你可以直接查询Win32_DiskDriveToDiskPartition来匹配给定的ID:

\REPETTIrootcimv2:Win32_DiskDrive.DeviceID="\.PHYSICALDRIVE1"  \REPETTIrootcimv2: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的情况下做,那么就有点更棘手了。

  • 首先你需要弄清楚哪个物理驱动器包含你的逻辑驱动器_你可以遵循如何列出物理磁盘?
  • 当您有物理驱动器名称时,最简单的方法是CreateFile()打开驱动器并获得DeviceIoControl()发送S.M.A.R.T.命令的信息。不要认为它总是那么容易:对于许多驱动器,它会失败,并且您需要管理权限。不幸的是,没有一个完美的解决方案,所以你需要尝试不同的方法。我想最好和最详尽的代码来处理这个是由Lynn McGuire为它的DiskId32实用程序编写的。