在Windows中识别程序的驱动器

3

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

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

有什么方法可以知道哪个驱动器包含正在运行的程序吗?谢谢!


可能是 从 Windows 中获取文件名的驱动器字母 的重复问题。 - Gábor Bakos
@GáborBakos 不是重复问题,OP正在寻找给定路径名的物理驱动器序列号。从文件名获取驱动器字母只是这项工作的第二步。 - Adriano Repetti
1个回答

2
假设您仍然想使用WMI进行操作:首先,您需要一些C++代码来读取WMI属性。不需要在此处重复,您可以在将C#中的CPU ID代码转换为C++中找到它。
当您拥有该代码后,就可以开始处理磁盘。首先,您需要记住Windows如何组织磁盘:
- 每个物理磁盘(Win32_DiskDrive)由分区(Win32_DiskPartition)组成。 - 每个分区(Win32_DiskPartition)是一个逻辑磁盘(Win32_LogicalDisk)。 - 它们之间的映射是通过Win32_DiskDriveToDiskPartitionWin32_LogicalDiskToPartition完成的。
您已经知道您正在运行的位置,那么您可以执行此映射:
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的情况下执行操作,则会变得有点棘手。

  • 首先,您需要确定哪个物理驱动器包含您的逻辑驱动器_您可以按照如何列出物理磁盘?的方式进行操作。
  • 当您有物理驱动器名称时,最简单的方法是使用CreateFile()打开驱动器,并使用DeviceIoControl()发送S.M.A.R.T命令获取信息。不要认为这总是那么容易:对于许多驱动器,它将失败,您需要管理员权限。不幸的是,没有一个单一的完美解决方案,因此您需要尝试不同的方法。据我所知,处理此问题的最佳和最详尽的代码是由Lynn McGuire为其DiskId32实用程序编写的。

谢谢!我不理解"\REPETTI\root"这行代码,但是无论如何,我已经按照你列出的WMI命令使用了它们: - NaBUru38
它的计算机名称是(在我的域中为Repetti)。如果您运行相同的查询,您将得到另一个名称。 - Adriano Repetti
谢谢!我没有理解"\REPETTI\root"那几行,但是我使用了你列出的WMI命令:
  1. 调用"GetModuleFileNameW()"函数获取分区盘符(例如"C")。
  2. 调用"wmic logicaldisk where (DeviceID="C:") assoc /assocclass:Win32_LogicalDiskToPartition"函数获取分区id("磁盘#0,分区#1")。
  3. 调用"wmic partition where (DeviceID="Disk #0, Partition #1") assoc /assocclass:Win32_DiskDriveToDiskPartition"函数获取物理驱动器id("\\.\PHYSICALDRIVE0")。
  4. 调用"wmic path win32_diskdrive get deviceid, serialnumber"函数获取序列号,并按照id进行搜索。
- NaBUru38
对的,乍一看就是这样! - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接