Einzelnen Beitrag anzeigen

jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#5

AW: GetLogicalDrives und DiskSize/DiskFree

  Alt 24. Jan 2025, 23:41
also ich muß zugeben, dass ich auch nicht der WMI Profi bin, aber als Ausgangspunkt verwende ich gerne für die WMI Quellcode Erzeugung den WMI Delphi Code Creator von der The Road to Delphi Seite(siehe auch angehängtes Foto). Die aktuelle Version findest du hier.
Der erzeugte Sourcecode von WMI Delphi Code Creator ist meist schon lauffähig. Der Quellcode von Button1 bis Button3 wurde mit dem WMI Delphi Code Creator erzeugt und geringfügig angepaßt. Ich denke, dass du mit den Infos theoretisch die Daten selber zusammenfügen kannst.

Als Bonus habe ich zufälliger Weise für die Zuordnung der Laufswerksbuchstaben ein funktionierendes Beispiel wieder von der The Road to Delphi Seite gefunden und in Button4 eingebaut.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    function getString( value: OLEVariant ): String;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Caption %s',[getString(FWbemObject.Caption)]));// String
      Memo1.Lines.Add(Format('DeviceID %s',[getString(FWbemObject.DeviceID)]));// String
      Memo1.Lines.Add(Format('Index %s',[getString(FWbemObject.index)]));// String
      Memo1.Lines.Add(Format('InterfaceType %s',[getString(FWbemObject.InterfaceType)]));// Array of String
      Memo1.Lines.Add(Format('MediaType %s',[getString(FWbemObject.MediaType)]));// Array of String
      Memo1.Lines.Add(Format('Model %s',[getString(FWbemObject.Model)]));// String
      Memo1.Lines.Add(Format('SerialNumber %s',[getString(FWbemObject.SerialNumber)]));// String
      Memo1.Lines.Add(Format('Size %s',[getString(FWbemObject.Size)]));// Uint64
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Antecedent %s',[String(FWbemObject.Antecedent)]));// String
      Memo1.Lines.Add(Format('Dependent %s',[String(FWbemObject.Dependent)]));// String
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Antecedent %s',[String(FWbemObject.Antecedent)]));// String
      Memo1.Lines.Add(Format('Dependent %s',[String(FWbemObject.Dependent)]));// String
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
{
  ursprüngliche Quelle: https://theroadtodelphi.com/2011/10/25/wmi-tasks-using-delphi-%E2%80%93-disks-and-file-systems/
}

const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  wmiDiskDrives : OLEVariant;
  wmiDiskPartitions : OLEVariant;
  wmiLogicalDisks : OLEVariant;
  wmiDiskDrive : OLEVariant;
  wmiDiskPartition : OLEVariant;
  wmiLogicalDisk : OLEVariant;
  oEnum : IEnumvariant;
  oEnum2 : IEnumvariant;
  oEnum3 : IEnumvariant;
  iValue : LongWord;
  DeviceID : string;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  //Get the physical disk drive
  wmiDiskDrives := FWMIService.ExecQuery('SELECT Caption, DeviceID FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(wmiDiskDrives._NewEnum) as IEnumVariant;
  while oEnum.Next(1, wmiDiskDrive, iValue) = 0 do
  begin
     //Use the disk drive device id to find associated partition
     DeviceID:=StringReplace(String(wmiDiskDrive.DeviceID),'\','\\',[rfReplaceAll]);
     wmiDiskPartitions := FWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="'+DeviceID+'"} WHERE AssocClass = Win32_DiskDriveToDiskPartition','WQL',wbemFlagForwardOnly);
     oEnum2 := IUnknown(wmiDiskPartitions._NewEnum) as IEnumVariant;
     while oEnum2.Next(1, wmiDiskPartition, iValue) = 0 do
     begin
        wmiLogicalDisks := FWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+String(wmiDiskPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition','WQL',wbemFlagForwardOnly);
        oEnum3 := IUnknown(wmiLogicalDisks._NewEnum) as IEnumVariant;
        while oEnum3.Next(1, wmiLogicalDisk, iValue) = 0 do
        begin
          Memo1.Lines.Add(Format('Drive letter associated with disk drive %s %s Partition %s is %s',[String(wmiDiskDrive.Caption),String(wmiDiskDrive.DeviceID),String(wmiDiskPartition.DeviceID),String(wmiLogicalDisk.DeviceID)]));
          wmiLogicalDisk:=Unassigned;
        end;
       wmiDiskPartition:=Unassigned;
     end;
    wmiDiskDrive:=Unassigned;
  end;
end;

function TForm1.getString( value: OLEVariant ): String;
begin
  if VarIsNull( value ) then result := ''
  else result := String( value );
end;

end.
Miniaturansicht angehängter Grafiken
delphiwmicodecreator.jpg  
Angehängte Dateien
Dateityp: zip WMIDiskdrives.zip (5,8 KB, 6x aufgerufen)

Geändert von jus (25. Jan 2025 um 00:17 Uhr)
  Mit Zitat antworten Zitat