Einzelnen Beitrag anzeigen

Glados
(Gast)

n/a Beiträge
 
#1

WMI: BytesPerSectors einer Festplatte ermitteln

  Alt 29. Okt 2017, 23:21
Ich komme gerade nicht weiter. Ich versuche die Sektorgröße einer Festplatte zu ermitteln.
Das Problem für mich jetzt ist, dass Win32_Volume zwar DriveLetter kennt, aber nicht BytesPerSector.
Dafür kennt Win32_DiskDrive BytesPerSector, aber nicht DriveLetter.
DriveLetter brauche ich aber um einen Vergleich anstellen zu können.

Das hier ist mein Code bisher (99% von WMI Code Ceator).
Ich habe Festplatte C (SanDisk SSD) und D (Seagate HDD).

Wenn ich im Aufruf unten "D" übergebe, zeigt mir die Showmessage als DriveLetter tatsächlich D, aber der Rest zeigt Daten meiner SSD (Caption).

Delphi-Quellcode:
procedure GetVolumeSectorSize(Volume: string);
 function GetWMIObject(const objectName: string): IDispatch;
 var
  chEaten: Integer;
  BindCtx: IBindCtx; // for access to a bind context
  Moniker: IMoniker; // Enables you to use a moniker object
 begin
  OleCheck(CreateBindCtx(0, BindCtx));
  OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); // Converts a string into a moniker that identifies the object named by the string
  OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); // Binds to the specified object
 end;

var
 FWMIService, FWMIServiceEx: OLEVariant;
 FWbemObjectSet, FWbemObjectSetEx: OLEVariant;
 oEnum, oEnumEx: IEnumvariant;
 iValue, iValueEx: LongWord;
begin;
 Volume := Trim(Volume);

 if Volume = 'then
  Exit;

 FWMIService := GetWMIObject(Format('winmgmts:\\%s\%s', ['.', 'root\CIMV2']));
 FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT * FROM %s WHERE DriveLetter=%s', ['Win32_Volume ', QuotedStr(Volume + ':')]), 'WQL', 0);
 oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumvariant;

 if oEnum.Next(1, FWbemObjectSet, iValue) = 0 then
  begin
   FWMIServiceEx := GetWMIObject(Format('winmgmts:\\%s\%s', ['.', 'root\CIMV2']));
   FWbemObjectSetEx := FWMIServiceEx.ExecQuery(Format('SELECT * FROM %s', ['Win32_DiskDrive']), 'WQL', 0);
   oEnumEx := IUnknown(FWbemObjectSetEx._NewEnum) as IEnumvariant;

   while oEnumEx.Next(1, FWbemObjectSetEx, iValueEx) = 0 do
    begin
     ShowMessage(string(FWbemObjectSet.Properties_.Item('DriveLetter', 0)) + sLineBreak + string(FWbemObjectSetEx.Properties_.Item('Caption', 0)) + ': ' + Format('BytesPerSector %d',
      [Integer(FWbemObjectSetEx.Properties_.Item('BytesPerSector', 0))]));
    end;
  end;
end;

CoInitialize(nil);
try
 GetVolumeSectorSize('D');
finally
 CoUninitialize;
end;
Resultat
Zitat:
D:
SanDis SDSSDHII120G SCSI Disk Device: BytesPerSector 512

Geändert von Glados (30. Okt 2017 um 03:25 Uhr)
  Mit Zitat antworten Zitat