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

opc*_*0de 7 delphi usb wmi

我正在使用WMI来获取所有插入的USB磁盘制造商的名称.代码工作得很好,但我有一个问题,我如何确定某个磁盘的女巫驱动器号...我只能得到设备名称,例如

(\\.\ PhysicalDrive1)...如何在正常的驱动器号中翻译它?

RRU*_*RUZ 14

如果您获得的值类似于\\.\PHYSICALDRIVE1使用Win32_DiskDrivewmi类和DeviceIDProperty的方法,那么为了获取Drive字母,您必须使用ASSOCIATORS类,这将在wmi类之间创建一个链接,其中包含您正在查找的信息for(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.
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢伙计.您应该写一本关于WMI可以做的很酷的事情的书:D. (2认同)