Mam's WebSite

Mamの覚書Q&A検索


大項目:「 Delphi 」 - 中項目:「 いろいろ 」

「 WMIを扱う 」

WMIを扱うサンプルは?


回答

以下ソース参照

ソース

unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls
  ,WbemScripting_TLB
  ,ActiveX
  ,comobj
  ,strutils;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.Button1Click(Sender: TObject);
var Locator:ISWbemLocator;
    Services:ISWbemServices;
 
    DiscDrives,Partitions,LogicalDisks: ISWbemObjectSet;
    strDDid:string;
    tmpEnum1,tmpEnum2,tmpEnum3: IEnumVariant;
    Value,value2,value3:   Cardinal;
 
    DD1,DD2,DD3: OleVariant;
    i1,i2,i3 : integer;
    Count1,Count2,Count3: Integer;
begin
  Locator:=CreateOleObject('WbemScripting.SWbemLocator') as ISWbemLocator;
  Services:=Locator.ConnectServer('.','\root\cimv2','','','','',0,nil);
  DiscDrives := Services.ExecQuery('Select * From Win32_DiskDrive'
                                  ,'WQL',wbemFlagReturnImmediately,nil);
  Count1 := DiscDrives.Count;
  tmpEnum1:= DiscDrives._NewEnum as IEnumVariant;
 
  for i1 := 1 to Count1 do
  begin
    tmpEnum1.Next(1, DD1, Value);
    strDDid:=DD1.DeviceID;
    strDDid:=StringReplace(strDDid,'\','\\',[rfReplaceAll]);
    //Memo1.Lines.Add('■DeviceID:' + strDDid + Chr(13) + Chr(10) +
    //                '  Caption=' + DD1.Caption + '');
    Partitions:=Services.ExecQuery(
            'ASSOCIATORS OF {Win32_DiskDrive.DeviceID="' +
            strDDid + '"} WHERE AssocClass = Win32_DiskDriveToDiskPartition'
             ,'WQL',wbemFlagReturnImmediately,nil);
    Count2:=Partitions.Count;
    tmpEnum2:=Partitions._NewEnum as IEnumVariant;
    for i2 := 1 to Count2 do
    begin
      tmpEnum2.Next(1,DD2,Value2);
      LogicalDisks:=Services.ExecQuery(
             'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+
             DD2.DeviceID+'"} WHERE AssocClass = Win32_LogicalDiskToPartition'
             ,'WQL',wbemFlagReturnImmediately,nil);
      count3:=LogicalDisks.Count;
      tmpEnum3:=LogicalDisks._NewEnum as IEnumVariant;
      for i3 := 1 to Count3 do
      begin
        tmpEnum3.Next(1,DD3,Value3);
        //if (LeftStr(DD1.PNPDeviceID,3)<>'IDE') and
        //   (LeftStr(DD1.PNPDeviceID,4)<>'SCSI') then
        begin
          memo1.Lines.Add(
            DD3.DeviceID+'ドライブ / '+DD1.model+' / '+DD1.PNPDeviceID
          );
          //memo1.Lines.Add(DD2.DeviceID);
        end;
      end;
    end;
  end;
end;
 
procedure TForm2.Button2Click(Sender: TObject);
var Locator:ISWbemLocator;
    Services:ISWbemServices;
 
    DiscDrives,Partitions,LogicalDisks: ISWbemObjectSet;
    strDDid:string;
    tmpEnum1,tmpEnum2,tmpEnum3: IEnumVariant;
    Value,value2,value3:   Cardinal;
 
    DD1,DD2,DD3: OleVariant;
    i1,i2,i3 : integer;
    Count1,Count2,Count3: Integer;
begin
  Locator:=CreateOleObject('WbemScripting.SWbemLocator') as ISWbemLocator;
  Services:=Locator.ConnectServer('.','\root\cimv2','','','','',0,nil);
  DiscDrives := Services.ExecQuery('Select * From Win32_FloppyDrive'
                                  ,'WQL',wbemFlagReturnImmediately,nil);
  Count1 := DiscDrives.Count;
  tmpEnum1:= DiscDrives._NewEnum as IEnumVariant;
 
  for i1 := 1 to Count1 do
  begin
    tmpEnum1.Next(1, DD1, Value);
    strDDid:=DD1.DeviceID;
    strDDid:=StringReplace(strDDid,'\','\\',[rfReplaceAll]);
 
    memo1.Lines.Add(
      'Aドライブ / '+DD1.Name+' / '+DD1.PNPDeviceID
    );
 
    if i1=99999 then
    begin
    Partitions:=Services.ExecQuery(
            'ASSOCIATORS OF {Win32_DiskDrive.DeviceID="' +
            strDDid + '"} WHERE AssocClass = Win32_DiskDriveToDiskPartition'
             ,'WQL',wbemFlagReturnImmediately,nil);
    Count2:=Partitions.Count;
    tmpEnum2:=Partitions._NewEnum as IEnumVariant;
    for i2 := 1 to Count2 do
    begin
      tmpEnum2.Next(1,DD2,Value2);
      LogicalDisks:=Services.ExecQuery(
             'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+
             DD2.DeviceID+'"} WHERE AssocClass = Win32_LogicalDiskToPartition'
             ,'WQL',wbemFlagReturnImmediately,nil);
      count3:=LogicalDisks.Count;
      tmpEnum3:=LogicalDisks._NewEnum as IEnumVariant;
      for i3 := 1 to Count3 do
      begin
        tmpEnum3.Next(1,DD3,Value3);
        //if (LeftStr(DD1.PNPDeviceID,3)<>'IDE') and
        //   (LeftStr(DD1.PNPDeviceID,4)<>'SCSI') then
        begin
          memo1.Lines.Add(
            DD3.DeviceID+'ドライブ / '+DD1.model+' / '+DD1.PNPDeviceID
          );
        end;
      end;
    end;
    end;
 
  end;
end;
 
end.

Copyright 2019 Mam