如何使用WMI和Delphi关联逻辑驱动器和物理磁盘? [英] How Can I Correlate Logical Drives and Physical Disks using the WMI and Delphi?

查看:144
本文介绍了如何使用WMI和Delphi关联逻辑驱动器和物理磁盘?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经对可以从Micro读取信息的应用程序进行了长时间的工作,一些(大多数)失败的还是缺少一些,我正在使用WMI和Delphi。
我遇到的问题是我需要列出属于每个高清的上市单位,例如:HD1有驱动器C :, D:等等。



谢谢

解决方案

要将逻辑驱动器和物理磁盘相关联,您必须使用 Win32_DiskDrive 类和 Win32_DiskDriveToDiskPartition Win32_LogicalDiskToPartition ASSOCIATORS 课程。



尝试此示例。 / p>

  {$ APPTYPE CONSOLE} 

使用
SysUti ls,
ActiveX,
ComObj,
变体;


函数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;
开始;
结果:='';
FSWbemLocator:= CreateOleObject('WbemScripting.SWbemLocator');
objWMIService:= FSWbemLocator.ConnectServer('localhost','root\CIMV2','','');
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)]));
//因为'\'是WMI中的一个保留字符,所以在DeviceID值中删除`\`个字符。
DeviceID:= StringReplace(objdiskDrive.DeviceID,'\','\\',[rfReplaceAll]);
//将Win32_DiskDriveDrive类与Win32_DiskDriveToDiskPartition类链接
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
如果不是VarIsNull(objPartition.DeviceID)然后
begin
Writeln(Format('分区%s',[string(objPartition.DeviceID)]));
//将Win32_DiskPartition类与Win32_LogicalDiskToPartition类关联。
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:=未分配;
结束
结束
objPartition:=未分配;
结束
objdiskDrive:=未分配;
结束
结束

begin
try
CoInitialize(nil);
try
ListDrives;
finally
CoUninitialize;
结束
除了
在E:Exception do
Writeln(E.Classname,':',E.Message);
结束
Readln;
结束。

这将输出如下所示

  DeviceID \\.\PHYSICALDRIVE0 
分区磁盘#0,分区#0
逻辑磁盘F:
DeviceID \\.\ PHYSICALDRIVE1
分区磁盘#1,分区#0
逻辑磁盘C:


I already have a long working on an application that can read information from Micro, some (most) failed more still missing some, I'm working with WMI and Delphi. The problem I'm facing is that I need to be listed units which belong to each HD, for example: HD1 has drive C:, D: and so on.

thank you

解决方案

To correlate the Logical Drives and Physical Disks you must use the Win32_DiskDrive class and the Win32_DiskDriveToDiskPartition, Win32_LogicalDiskToPartition ASSOCIATORS classes.

Try this sample.

{$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', 'root\CIMV2', '', '');
  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.

This will output something like so

DeviceID \\.\PHYSICALDRIVE0
   Partition Disk #0, Partition #0
     Logical Disk F:
DeviceID \\.\PHYSICALDRIVE1
   Partition Disk #1, Partition #0
     Logical Disk C:

这篇关于如何使用WMI和Delphi关联逻辑驱动器和物理磁盘?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆