加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用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:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读