【问题标题】:Identify the drive of a program on Windows在 Windows 上识别程序的驱动器
【发布时间】:2016-01-02 05:55:36
【问题描述】:

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

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

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

【问题讨论】:

  • @GáborBakos 不是骗子,OP 正在搜索给定路径名的物理驱动器序列号。从文件名中获取驱动器号只是这项工作的第二步。

标签: c++ wmic serial-number


【解决方案1】:

假设您仍然想使用 WMI:首先您需要一些代码来读取 C++ 中的 WMI 属性。此处无需赘述,您可以在Getting CPU ID code from C# to be in C++找到。

当您拥有该代码时,您可以统计使用磁盘。首先你需要记住 Windows 是如何组织磁盘的:

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

你已经知道where you're running那么你可以做这个映射:

Win32_LogicalDisk 获取DeviceID 属性与您正在运行的驱动器匹配的位置:

DeviceID=C:

查询Win32_LogicalDiskToPartition 并选择AntecedentDependent 具有您之前找到的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 的情况下执行此操作,那么它有点更加棘手。

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

【讨论】:

  • 谢谢!我不明白 "\\REPETTI\root" 行,但无论如何,我使用了您列出的 WMI 命令,如下所示:。
  • 这是计算机名(Repetti,在我的域中)。如果您运行相同的查询,您将获得另一个名称
  • 谢谢!我不理解“\\REPETTI\root”行,但我使用了您列出的 WMI 命令: 1. 调用“GetModuleFileNameW()”来获取分区字母(例如“C”)。 2.调用“wmic logicaldisk where (DeviceID="C:") assoc /assocclass:Win32_LogicalDiskToPartition”获取分区id(“Disk #0, Partition #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查找。
  • 对,乍一看就是这样!
猜你喜欢
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2014-01-28
  • 2015-05-14
相关资源
最近更新 更多