如何使用WMI和Delphi关联逻辑驱动器和物理磁盘?
发布时间:2020-12-15 09:09:29 所属栏目:大数据 来源:网络整理
导读:我已经有一个很长的工作在一个可以从Micro读取信息的应用程序,一些(大多数)失败更多仍然缺少一些,我正在使用WMI和Delphi. 我面临的问题是我需要列出属于每个HD的单元,例如:HD1有驱动器C:,D:等等. 谢谢 解决方法 要关联逻辑驱动器和物理磁盘,必须使用 Win3
我已经有一个很长的工作在一个可以从Micro读取信息的应用程序,一些(大多数)失败更多仍然缺少一些,我正在使用WMI和Delphi.
我面临的问题是我需要列出属于每个HD的单元,例如:HD1有驱动器C:,D:等等. 谢谢 解决方法
要关联逻辑驱动器和物理磁盘,必须使用
Win32_DiskDrive 类和
Win32_DiskDriveToDiskPartition ,Win32_LogicalDiskToPartition
ASSOCIATORS类.
试试这个样本. {$APPTYPE CONSOLE} uses SysUtils,ActiveX,ComObj,Variants; function ListDrives : string; var FSWbemLocator : OLEVariant; objWMIService : OLEVariant; colDiskDrives : OLEVariant; colLogicalDisks: OLEVariant; colPartitions : OLEVariant; objdiskDrive : OLEVariant; objPartition : OLEVariant; objLogicalDisk : OLEVariant; oEnumDiskDrive : IEnumvariant; oEnumPartition : IEnumvariant; oEnumLogical : IEnumvariant; iValue : LongWord; DeviceID : string; begin; Result:=''; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); objWMIService := FSWbemLocator.ConnectServer('localhost','rootCIMV2','',''); colDiskDrives := objWMIService.ExecQuery('SELECT DeviceID FROM Win32_DiskDrive'); oEnumDiskDrive := IUnknown(colDiskDrives._NewEnum) as IEnumVariant; while oEnumDiskDrive.Next(1,objdiskDrive,iValue) = 0 do begin Writeln(Format('DeviceID %s',[string(objdiskDrive.DeviceID)])); //Escape the `` chars in the DeviceID value because the '' is a reserved character in WMI. DeviceID := StringReplace(objdiskDrive.DeviceID,'','',[rfReplaceAll]); //link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class colPartitions := objWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="%s"} WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID])); oEnumPartition := IUnknown(colPartitions._NewEnum) as IEnumVariant; while oEnumPartition.Next(1,objPartition,iValue) = 0 do begin if not VarIsNull(objPartition.DeviceID) then begin Writeln(Format(' Partition %s',[string(objPartition.DeviceID)])); //link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class. colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+VarToStr(objPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition'); oEnumLogical := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant; while oEnumLogical.Next(1,objLogicalDisk,iValue) = 0 do begin Writeln(Format(' Logical Disk %s',[string(objLogicalDisk.DeviceID)])); objLogicalDisk:=Unassigned; end; end; objPartition:=Unassigned; end; objdiskDrive:=Unassigned; end; end; begin try CoInitialize(nil); try ListDrives; finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname,':',E.Message); end; Readln; end. 这将输出类似的东西 DeviceID .PHYSICALDRIVE0 Partition Disk #0,Partition #0 Logical Disk F: DeviceID .PHYSICALDRIVE1 Partition Disk #1,Partition #0 Logical Disk C: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |