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

在Windows上识别程序的驱动器 我有一个用C++编写的Windows程序。要获取计算机驱动器的驱动器序列号,我使用_popen()在程序中运行“wmic path win32_physicalmedia get SerialNumber”,c++,wmic,serial-number,C++,Wmic,Serial Number,但是,运行该程序的计算机可能有许多驱动器,并且USB驱动器也会出现在列表中 我如何才能知道哪个驱动器有我正在运行的程序?谢谢

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


我如何才能知道哪个驱动器有我正在运行的程序?谢谢 当你有了这些代码后,你就可以使用磁盘了。首先,您需要记住Windows如何组织磁盘:

  • 每个物理磁盘(
    Win32\U DiskDrive
    )由分区(
    Win32\U DiskPartition
    )组成
  • 每个分区(
    Win32\u-DiskPartition
    )都是一个逻辑磁盘(
    Win32\u-LogicalDisk
  • 使用
    Win32\u DiskDriveToDiskPartition
    Win32\u LogicalDiskToPartition
    完成彼此之间的映射
您已经知道可以进行以下映射:

Win32\u LogicalDisk
获取
DeviceID
属性与正在运行的驱动器匹配的驱动器:

DeviceID=C:
查询
Win32\u LogicalDiskToPartition
并选择
Antecedent
,您以前为其找到了
Dependent
ID:

\\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"  \\REPETTI\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
现在,您应该在
Win32\u DiskPartition
中查询分区,以找到
DeviceID
Disk\1,Partition\1
的分区,但是
Win32\u DiskDriveToDiskPartition
使用
DeviceID
进行此映射,然后您可以直接查询
Win32\u DiskDriveToDiskPartition
,以匹配给定的ID:

\\REPETTI\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1"  \\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"
现在您只需查询Win32\U DiskDrive搜索设备ID
\\。\PHYSICALDRIVE1

WDC WDxxx ATA Device  \\.\PHYSICALDRIVE1  WDC WDxxx ATA Device
您可以获取其序列号(在这种情况下,相同的属性在
Win32\u PhysicalMedia
Win32\u DiskDrive
中都可用,否则您应该按其
标题进行搜索)

不带WMI

如果您必须在没有WMI的情况下执行此操作,那么它会有点棘手

  • 首先,您需要确定哪个物理驱动器包含您的逻辑驱动器,您可以遵循
  • 当您有物理驱动器名时,最简单的方法是使用
    CreateFile()
    打开驱动器并使用
    DeviceIoControl()
    发送S.M.A.R.T获取信息。命令。不要认为它总是那么容易:有很多驱动器它会失败,你需要管理权限。不幸的是,没有一个完美的解决方案,那么你需要尝试不同的方法。Lynn McGuire为其实用程序编写了AFAIK处理此问题的最佳和最详尽的代码

可能重复@GáborBakos not dupe,OP正在搜索给定路径名的物理驱动器序列号。从文件名中获取驱动器号只是这项工作的第二步。谢谢!我不理解“\\REPETTI\root”行,但无论如何,我使用了您列出的WMI命令,如下所示:。它是计算机名(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\U DiskDriveToDiskPartition”以获取物理驱动器id(“\\\\\.\\PHYSICALDRIVE0”)。4.调用“wmic path win32_diskdrive get deviceid,serialnumber”获取序列号,并按id搜索。对,乍一看就是这样!