Prüfen ob Laufwerksangabe ein virtuelles Laufwerk ist.

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    Prüfen ob Laufwerksangabe ein virtuelles Laufwerk ist.

    Hallo, ist es möglich zu prüfen ob ein Laufwerk ein virtuelles Laufwerk ist?

    Aktuell prüfe ich mit folgendem Code, ob das vom Anwender angegebene Laufwerk ein CD / DVD Laufwerk ist.
    Das funktioniert soweit. Allerdings wird auch ein mein virtuelles Laufwerk dadurch erkannt.

    Gibt es eine (einfache) Möglichkeit, ob das angegebene Laufwerk tatsächlich ein "echtes" oder ein virtuelles Laufwerk ist.

    VB.NET-Quellcode

    1. Dim DeviceInfo As System.IO.DriveInfo = New System.IO.DriveInfo(MountDevice)
    2. If DeviceInfo.DriveType = IO.DriveType.CDRom Then
    3. End If
    @Humax Schau mal hier rein und teste, ob sich der Rückgabewert unterscheidet:
    dotnet-snippets.de/snippet/ers…-virtuellen-laufwerks/720
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In dem Codesnippet wird ja ein Ordner als Laufwerk erstellt. Als Ergebnis meiner Abfrage erhalte ich dann : IO.DriveType.fixed

    Ich erkläre mal kurz was ich erreichen will.
    In meinem Fall habe ich ja verschiedene Laufwerke:
    c und d als Festplatte
    e als CD Rom Laufwerk
    g und h als Virtuelle Laufwerke
    x,y und z als Netzlaufwerke.

    Der Anwender gibt jetzt ein Laufwerksbuchstaben an. Bzw. das Programm liest den Wert aus einer Datei ein. Beispielsweise den Wert "c:\". Das Programm soll jetzt eine vorgegebene Datei "mounten" und zwar unter dem angegeben Verzeichnis. Vorher soll halt geprüft werden ob es auch ein passendes (virtuelles) Laufwerk ist.

    Falls man nicht zwischen echtem und virtuellen unterscheiden kann würde ich einfach das mounten starten und dann den Fehler einfach abfangen...
    Ich weiß nicht, ob es was nützt - jedenfalls erhalte ich dieses Info bei einem virtuellen CD-ROM-Laufwerk und einem virtuellen DVD-ROM-Laufwerk (bzw. CD-ROM mit 4,55GB) mit Daemon-Tool-Lite jeweils unter E: und F: eingebunden - da steht in Caption und DeviceID was von 'Virtual', ich kann allerdings nicht gegenprüfen, was bei einem echten Laufwerk ausgegeben wird, da mir kein echtes Laufwerk in diesem PC zur Verfügung steht. Darunter ist noch ein Test mit echten Festplatten, wenn man in 'FROM Win32_DiskDrive' schaut.

    VB.NET-Quellcode

    1. Public Sub CDDrive_Test()
    2. 'Imports System.Management !!!
    3. Try
    4. Dim searcher As New ManagementObjectSearcher(
    5. "root\CIMV2",
    6. "SELECT * FROM Win32_CDROMDrive")
    7. For Each queryObj As ManagementObject In searcher.Get()
    8. Console.WriteLine("-----------------------------------")
    9. Console.WriteLine("Win32_CDROMDrive instance")
    10. Console.WriteLine("-----------------------------------")
    11. Console.WriteLine("Caption: {0}", queryObj("Caption"))
    12. Console.WriteLine("DeviceID: {0}", queryObj("DeviceID"))
    13. Console.WriteLine("Drive: {0}", queryObj("Drive"))
    14. Next
    15. Catch err As ManagementException
    16. MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
    17. End Try
    18. End Sub


    -----------------------------------
    Win32_CDROMDrive instance
    -----------------------------------
    Caption: DiscSoft Virtual SCSI CdRom Device
    DeviceID: DTLITESCSIBUS\CDROM&VEN_DISCSOFT&PROD_VIRTUAL&REV_1.0\1&2AFD7D61&0&0000
    Drive: E:
    -----------------------------------
    Win32_CDROMDrive instance
    -----------------------------------
    Caption: DiscSoft Virtual SCSI CdRom Device
    DeviceID: DTLITESCSIBUS\CDROM&VEN_DISCSOFT&PROD_VIRTUAL&REV_1.0\1&2AFD7D61&0&0001
    Drive: F:



    Bei Festplatten, wenn man in 'FROM Win32_DiskDrive' schaut, steht z.B. das:

    -----------------------------------
    Win32_DiskDrive instance
    -----------------------------------
    Caption: ST1000DM010-2EP102 ATA Device
    DeviceID: \\.\PHYSICALDRIVE1
    -----------------------------------
    Win32_DiskDrive instance
    -----------------------------------
    Caption: ST1000DM010-2EP102 ATA Device
    DeviceID: \\.\PHYSICALDRIVE0
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gregor Jasinski“ ()

    Humax schrieb:

    In dem Codesnippet wird ja ein Ordner als Laufwerk erstellt.
    Verwende diese Funktion aus dem Link:

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
    2. Private Shared Function GetDriveType(ByVal lpRootPathName As String) As Integer
    3. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Humax schrieb:

    wenn kein Image gemountet ist
    Ich kann das jetzt nicht überprüfen. Aber: Was zeigt der Explorer in diesem Fall an?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Humax schrieb:

    (...) Könntest du mal prüfen ob du die Laufwerke auch so ermitteln kannst, wenn kein Image gemountet ist (...)

    Wenn die virtuellen Laufwerke nicht eingebunden sind (gar nicht existieren), wird in der Console als Text nichts ausgegeben, d.h. es sind vermutlich keine Einträge vorhanden (echte CD-Roms sind ja - wie ich schon erwähnt habe - nicht montiert) und somit wird die For-Each-Schleife gar nicht erst angesprungen bzw. der Inhalt ausgeführt, er springt aber nicht in die Catch-Abzweigung hinein. Hinter Next und auch abwechselnd im Catch habe ich testweise Beep() reingesetzt, um zu überprüfen, ob er da tatsächlich alles durchläuft - der Ton ertönt hinter Next, d.h. er geht da ohne Fehler durch. Nebenbei möchte ich noch erwähnen, dass es noch viele andere Einträge gibt, nicht nur in Win32 und unter CIMV2 - das waren die ersten, die mir so eingefallen sind, ansonsten - wenn man noch andere finden möchte - müsste man sich da durchgraben.

    Edit: ich schreibe gleich noch was dazu...

    Nachtrag: also wenn ein Laufwerk erzeugt ist und weiter existiert, aber das Image (sozusagen die CD) aus ihm entfernt wird, kommt das raus (das zweite Laufwerk F: habe ich mir erspart):

    -----------------------------------
    Win32_CDROMDrive instance
    -----------------------------------
    Caption: DiscSoft Virtual SCSI CdRom Device
    DeviceID: DTLITESCSIBUS\CDROM&VEN_DISCSOFT&PROD_VIRTUAL&REV_1.0\1&2AFD7D61&0&0000
    Drive: E:
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Gregor Jasinski“ ()

    @Humax Du könntest evtl. auch mit den IMAPI Interfaces -> learn.microsoft.com/en-us/windows/win32/imapi/using-imapi entsprechende Infos auslesen. Virtuelle CD-ROM Laufwerke können z.B. nur lesen, aber keine CDs brennen. Natürlich kann man darüber auch andere Infos zu den CD-Laufwerken auslesen. Hier wäre ein Einstieg dazu: learn.microsoft.com/en-us/wind…pi/checking-drive-support Für Dich wären neben VendorId, ProductId usw, die Supported Features von Interesse.
    Mfg -Franky-
    Danke an alle für die Beiträge.

    Ich wollte es bei meinem obigem Code belassen, da ich vier verschiedene Programme / Möglichkeiten zum Mounten einer Datei ausprobiert habe und keine Übereinstimmungen gefunden habe, wie ich hätte ermitteln können ob es sich um ein virtuelles Laufwerk handelt, bzw. hätte ich das zwar so bewerkstelligen können, aber wenn jemand ein anderes Programm nutzt, hätte es wieder anders aussehen können.

    Dann ist mir aber aufgefallen, dass ja ICH vorgebe, wie das Image gemountet wird (Manchmal sieht man den Wald vor Bäumen nicht...). Also kann ich das mit dem Code von @Gregor Jasinski lösen.

    Danke
    @Humax. Wenn Du von mounten einer Datei sprichst, handelt es sich hierbei um ISO-Dateien? Wenn ja, die kannst mit ein paar Windows-APIs selbst ab Win8?, definitiv unter/ab Win10 mounten. Dazu muss noch nicht einmal ein virtuelles CD-Rom Laufwerk vorhanden sein. Das erzeugt Windows dann selber. Ist die ISO dann gemountet, lässt sich auch der Laufwerksbuchstabe dazu ermitteln oder wenn man den Laufwerksbuchstaben kennt, den Pfad zur ISO. Wird der Code mit Adminrechten ausgeführt, kann man sogar den Laufwerksbuchstaben vorgeben, in der die ISO dann gemountet werden soll. Ob das auch so für andere Imageformate wie IMG funktioniert, kann ich Dir nicht beantworten.

    Edit: Nur der Vollständigkeit halber: Die entsprechenden APIs zum mounten/unmounten von ISOs, VHDs gibt es bereits ab Win7. z.B. OpenVirtualDisk, AttachVirtualDisk usw. Siehe auch hier: learn.microsoft.com/en-us/windows/win32/api/virtdisk/
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()