2011-07-11 50 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

相關問題