在Windows上识别程序的驱动器 我有一个用C++编写的Windows程序。要获取计算机驱动器的驱动器序列号,我使用_popen()在程序中运行“wmic path win32_physicalmedia get SerialNumber”
但是,运行该程序的计算机可能有许多驱动器,并且USB驱动器也会出现在列表中在Windows上识别程序的驱动器 我有一个用C++编写的Windows程序。要获取计算机驱动器的驱动器序列号,我使用_popen()在程序中运行“wmic path win32_physicalmedia get SerialNumber”,c++,wmic,serial-number,C++,Wmic,Serial Number,但是,运行该程序的计算机可能有许多驱动器,并且USB驱动器也会出现在列表中 我如何才能知道哪个驱动器有我正在运行的程序?谢谢
我如何才能知道哪个驱动器有我正在运行的程序?谢谢假设你仍然想用WMI来做它:首先,你需要一些代码来读取C++中的WMI属性。无需在此重复,您可以在中找到它 当你有了这些代码后,你就可以使用磁盘了。首先,您需要记住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搜索。对,乍一看就是这样!