如何获取 USB 设备的驱动器号?

Posted

技术标签:

【中文标题】如何获取 USB 设备的驱动器号?【英文标题】:How can I get the drive letter of an USB device? 【发布时间】:2011-10-02 22:49:13 【问题描述】:

我正在使用 WMI 获取所有插入的 USB 磁盘的制造商名称。该代码运行良好,但我有一个问题,如何确定某个磁盘具有的巫婆驱动器号...我只能获取设备名称,例如

(\\.\PhysicalDrive1) ...如何将其转换为普通驱动器号?

【问题讨论】:

RRUZ 很快就会出现。 【参考方案1】:

如果您获得像 \\.\PHYSICALDRIVE1 这样的值,则意味着您正在使用 Win32_DiskDrive wmi 类和 DeviceID 属性,因此为了获得驱动器号,您必须使用 ASSOCIATORS 类,这将创建一个链接wmi 类之间包含您正在寻找的信息 (Win32_LogicalDisk) 和您正在使用的类 (Win32_DiskDrive)。

所以你必须这样做

Win32_DiskDrive-> Win32_DiskDriveToDiskPartition -> Win32_DiskPartition -> Win32_LogicalDiskToPartition -> Win32_LogicalDisk

检查这个示例函数

$APPTYPE CONSOLE

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;


function DeviceIDToDrive(const ADeviceID : string) : string;
var
  FSWbemLocator  : OLEVariant;
  objWMIService  : OLEVariant;
  colLogicalDisks: OLEVariant;
  colPartitions  : OLEVariant;
  objPartition   : OLEVariant;
  objLogicalDisk : OLEVariant;
  oEnumPartition : IEnumvariant;
  oEnumLogical   : IEnumvariant;
  iValue         : LongWord;
  DeviceID       : string;
begin;
  Result:='';
  FSWbemLocator   := CreateOleObject('WbemScripting.SWbemLocator');
  objWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  DeviceID        := StringReplace(ADeviceID,'\','\\',[rfReplaceAll]); //Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
  colPartitions   := objWMIService.ExecQuery(Format('ASSOCIATORS OF Win32_DiskDrive.DeviceID="%s" WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID]));//link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class
  oEnumPartition  := IUnknown(colPartitions._NewEnum) as IEnumVariant;
  while oEnumPartition.Next(1, objPartition, iValue) = 0 do
   begin
       if not VarIsNull(objPartition.DeviceID) then
       begin
        colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF Win32_DiskPartition.DeviceID="'+VarToStr(objPartition.DeviceID)+'" WHERE AssocClass = Win32_LogicalDiskToPartition'); //link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class.
        oEnumLogical  := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant;
          if oEnumLogical.Next(1, objLogicalDisk, iValue) = 0 then
          begin
              Result:=objLogicalDisk.DeviceID;
              objLogicalDisk:=Unassigned;
          end;
       end;
       objPartition:=Unassigned;
   end;
end;

begin
 try
    CoInitialize(nil);
    try
      Writeln(DeviceIDToDrive('\\.\PHYSICALDRIVE2'));
    finally
      CoUninitialize;
    end;
 except
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
  end;
  Readln;
end.

【讨论】:

非常感谢伙计。你应该写一本关于你可以用 WMI 做的很酷的事情的书:D。 @opc0de - 我想到了整个 Windows 内部;例如,Preview handler 需要我几个月的时间来开发 :) (+1)

以上是关于如何获取 USB 设备的驱动器号?的主要内容,如果未能解决你的问题,请参考以下文章

C#怎么获取已知USB设备驱动信息

如何在 Qt 中获取 Linux 上 USB 驱动器的路径?

如何从 Windows 内核驱动程序获取设备实例路径?

如何在 Linux 下的 C 中确定 USB 存储(USB 闪存驱动器)“设备路径”

Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

ubuntu 下如何获取USB接口相机的uri路径