![]() |
Partition zu phys. LW?
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 |
AW: Partition zu phys. LW?
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Das macht exakt was Du möchtest.
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. Im Anhang Binary plus Source. Ps: Ob man Admin-Rechte braucht oder nicht teste bitte selber, da enthalte ich mich. |
AW: Partition zu phys. LW?
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 |
AW: Partition zu phys. LW?
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? |
AW: Partition zu phys. LW?
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. |
AW: Partition zu phys. LW?
Ok ich verstehe, ich tüftel mal was... bis gleich :=)
|
AW: Partition zu phys. LW?
hier würde sich
![]() |
AW: Partition zu phys. LW?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Im Anhang ist ein komplett Lauffähiges mini-Programm was nur eine Sache macht, es listet auf Knopfdruck alle DriveLetters auf mit den dazu gehörigen Infos. Laufwerk Letter Typ Schreibstatus ges.Größe freieGröße Seriennummer Label Was Dich Interessieren wird ist
Delphi-Quellcode:
das.
function GetPhysicalDiskNumber(Drive: Char): Integer;
Diese Funktion macht folgendes, übergebe Ihr ein Letter und Du erhälst die Laufwerksnummer. Das war es doch was Du wolltest, richtig? Binary plus Source im Anhang. Ps: Alles Winapi und nicht WMI. Pps: Da hier nicht über Volumes gegangen wird bleiben versteckte Partitionen weiterhin versteckt. Achso, und wenn CD/DVD Laufwerke connected sind, die bekommen als Laufwerk die Nummer 255. |
AW: Partition zu phys. LW?
Guten Morgen!
Wunderbar! Genau das war es. Indirekt habe ich das hinbekommen, aber es hat mich immer gestört, dass es da nichts direktes geben soll. Und das schon eine ziemliche Weile! Vielen Dank! Gruß Mattze |
AW: Partition zu phys. LW?
Ja gern geschehen, wenn Du Dir den Source anschaust, es ist nicht gerade einfach so etwas simples wie das was Du wolltest umzusetzen. Freut mich wenn es passt. Viel Erfolg mit Deinem Projekt!
Ps: Immer noch meinerseits nicht bestätigt Deine Bitte von wegen ohne Admin, das teste bitte selbst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz