How can I get the drive letter of a USB device?

I use WMI so that all inserted USB drives produce names. The code works fine, but I have a problem, how can I determine the drive letter of a witch on a specific drive ... I can only get the device name, for example,

(\\. \ PhysicalDrive1) ... how can I translate this into a regular drive letter?

+7
source share
1 answer

If you get values ​​like \\.\PHYSICALDRIVE1 means that you are using the Win32_DiskDrive class and the DeviceID property, so to get the drive letter, you must use the ASSOCIATORS class, which will create a connection between the wmi classes with the information you are looking for ( Win32_LogicalDisk ) and the class you are using ( Win32_DiskDrive ).

So you should do something like this

Win32_DiskDrive β†’ Win32_DiskDriveToDiskPartition β†’ Win32_DiskPartition β†’ Win32_LogicalDiskToPartition β†’ Win32_LogicalDisk

Check this sample function

 {$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. 
+14
source

All Articles