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.
Rruz
source share