我使用WMI來獲取所有插入的USB磁盤製造商名稱。代碼工程很好,但我有一個問題,我怎麼能確定巫婆驅動器盤符某個磁盤有...我只能得到設備名稱,例如如何獲取USB設備的驅動器號?
(\\。\ PhysicalDrive1)...我該如何翻譯這個在一個正常的驅動器號?
我使用WMI來獲取所有插入的USB磁盤製造商名稱。代碼工程很好,但我有一個問題,我怎麼能確定巫婆驅動器盤符某個磁盤有...我只能得到設備名稱,例如如何獲取USB設備的驅動器號?
(\\。\ PhysicalDrive1)...我該如何翻譯這個在一個正常的驅動器號?
如果您收到類似\\.\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
@ opc0de - 我想到整個Windows內部;例如[預覽處理程序](https://code.google.com/p/delphi-preview-handler/)需要幾個月才能開發:)(+1) – 2011-07-11 23:12:16
RRUZ將在這裏很快。 –
yep rruz是wmi大師:D – opc0de