2011-07-11 53 views
7

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

(\\。\ PhysicalDrive1)...我该如何翻译这个在一个正常的驱动器号?

+6

RRUZ将在这里很快。 –

+2

yep rruz是wmi大师:D – opc0de

回答

14

如果您收到类似\\.\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. 
+2

非常感谢大副。你应该写一本关于你可以用WMI做的很酷的事情的书:D。 – opc0de

+0

@ opc0de - 我想到整个Windows内部;例如[预览处理程序](https://code.google.com/p/delphi-preview-handler/)需要几个月才能开发:)(+1) – 2011-07-11 23:12:16

相关问题