AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Partition zu phys. LW?

Ein Thema von Mattze · begonnen am 12. Jun 2018 · letzter Beitrag vom 18. Jun 2018
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Partition zu phys. LW?

  Alt 12. Jun 2018, 19:40
Hi,

ich hab' da mal 'ne Frage - die ich schon sehr lange habe:
Kennt jemand eine (möglichst direkte) Variante, zu welchem physischen Laufwerk eine Partition gehört?

Indirekit habe ich das (alle phys. LW und alle Partitionen auf diesen auslesen und vergleichen), aber möglichst direkt und nicht als Admin?

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Partition zu phys. LW?

  Alt 12. Jun 2018, 19:56
Delphi-Quellcode:
program test;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;

procedure Main;
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
          Writeln(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;
    Writeln;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      Main;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.
Das macht exakt was Du möchtest.

Im Anhang Binary plus Source.


Ps: Ob man Admin-Rechte braucht oder nicht teste bitte selber, da enthalte ich mich.
Angehängte Dateien
Dateityp: 7z test.7z (50,3 KB, 11x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (12. Jun 2018 um 20:00 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

AW: Partition zu phys. LW?

  Alt 12. Jun 2018, 20:11
Hi,

vielen Dank für die schnelle Amtwort. Auf WMI hätte ich auch selber kommen müssen, aber manchmal sieht ma eben den Wald vor lauter Bäumen nicht.

Das ist eine der "indirekten" Varianten.

Fragestellung:

Ich habe Partition J:. Auf welchem phys. Laufwerk ist die?

Die indirekte Variante: Man sucht alle physischen Laufwerke und deren Partitionen zusammen und vergleicht, wo Partition J: ist. Dann hat man das Ergebnis.
Ich gehe aber davon aus, dass das eigentlich sehr oft (vom IO-System) gebraucht wird und es daher eine schnellere direkte Variante gibt.

Gibt es sowas?

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Partition zu phys. LW?

  Alt 12. Jun 2018, 20:22
Ich Verstehe die Frage nicht ganz.
Der Source da oben gibt Dir alle Verbauten PHYSICALDRIVEs plus jeweils die zugehörigen Partitions-Nummer + Driveletter (#0 #1 #2 usw <-> C: D: E: usw)
Reicht das nicht aus um das zu basteln was Du möchtest?
Gruß vom KodeZwerg

Geändert von KodeZwerg (12. Jun 2018 um 20:25 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

AW: Partition zu phys. LW?

  Alt 12. Jun 2018, 20:35
Hi,

natürlich reicht das auch.
Ich habe nur die umgekehrte Fragestellung.
Wie Du selber schreibst:
Zuerst (!) kriegst Du die physischen LWs, dann die Partitionsnummer und dann den Driveletter.

Ich möchte es genau anderschrum:
Ich habe den Driveletter und möchte von dem ausgehend (!) das physische LW kriegen.
(Und nicht über Deinen Weg mit Vergleich des Driveletters!)

Gruß
Mattze

PS: Dein WMI-Weg klappt übrigens ohne ADMIN-Rechte.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Partition zu phys. LW?

  Alt 12. Jun 2018, 20:54
Ok ich verstehe, ich tüftel mal was... bis gleich :=)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz