none
Nummer des Datenträgers ermitteln RRS feed

  • Frage

  • Hi Community,

    ich möchte per VB-Code die Nummer des Datenträgers ermitteln, auf dem sich ein bestimmtes Laufwerk befindet.

    Beispielsweise befindet sich laut Anzeige der Datenträgerverwaltung das Laufwerk C: auf Datenträger 0.

    Visual Studio 2012, Windows 10 - 64 Bit

    Weiß jemand Rat?

    Darüber hinaus ist mir aufgefallen, dass meine permanent angesteckte externe USB-Festplatte beim Einschalten des PC's mal als Datenträger 2 und mal als Datenträger 5 verbunden wird. Vermutlich je nachdem, wie fix die Platte sich meldet.

    Ist die Datenträgernummer irgendwie konfigurierbar, so dass die Platte immer die gleiche Nummer erhält?

    LG Gruß

    Jörg

    Dienstag, 23. Februar 2016 18:37

Antworten

  • Hallo Jörg,

    du kannst folgendes Beispiel in Kombination mit folgender Klasse verwenden. Entscheidend dabei ist die Eigenschaft Index der Klasse Win32_DiskDrive.

    Gruss,

    LBB

    • Als Antwort markiert Joerg 55 Freitag, 26. Februar 2016 20:48
    Donnerstag, 25. Februar 2016 22:14
  • Hallo Jörg,

    du kannst die gewünschten Informationen über WMI (System.Management) ermitteln.

    Wenn du dir die Ausgabe anschaust, wirst du alle möglichen Infos finden und die benötigten herauspicken können.

    Vielleicht hilft das weiter...

    Imports System.Management Public Class MyDisks Public Sub GetInfos() Dim disks As Dictionary(Of String, String()) = GetProperties(WMI_Items.Win32_DiskDrive) For Each kvp As KeyValuePair(Of String, String()) In disks Console.WriteLine($"ID: {kvp.Key}:") If kvp.Value IsNot Nothing Then For Each value As String In kvp.Value Console.WriteLine($" Value: {value}") Next Else Console.WriteLine($" Value: Nothing") End If Next End Sub

    Public Enum WMI_Items Win32_CDROMDrive Win32_DiskDrive Win32_FloppyDrive Win32_PhysicalMedia Win32_TapeDrive End Enum Public Shared Function GetProperties(ByVal WMI_Item As WMI_Items) As Dictionary(Of String, String()) Dim MOS As ManagementObjectSearcher = New ManagementObjectSearcher("Select * from " & WMI_Item.ToString) Dim MOC As ManagementObjectCollection = MOS.Get Dim MO As ManagementObject Dim PD As PropertyData Dim HWList As New Dictionary(Of String, String()) For Each MO In MOC For Each PD In MO.Properties If Not PD.Value Is Nothing Then If HWList.ContainsKey(PD.Name) = False Then HWList.Add(PD.Name, GetProperty(WMI_Item, PD.Name)) End If End If Next Next Return HWList End Function Public Shared Function GetProperty(ByVal WMI_Item As WMI_Items, ByVal PropertyName As String) As String() Dim MOS As ManagementObjectSearcher = New ManagementObjectSearcher("Select " & PropertyName & " from " & WMI_Item.ToString) Dim MOC As ManagementObjectCollection = MOS.Get Dim MO As New ManagementObject Dim Values As New List(Of String) Try For Each MO In MOC Values.Add(MO.GetPropertyValue(PropertyName)) Next Catch ex As Exception Return Nothing End Try Return Values.ToArray End Function End Class

    Gruß


    • Bearbeitet K. Pater Donnerstag, 25. Februar 2016 22:25
    • Als Antwort markiert Joerg 55 Freitag, 26. Februar 2016 20:33
    Donnerstag, 25. Februar 2016 22:24

Alle Antworten

  • Hallo Joerg 55,

    Ich bin nicht sicher, ob Dir das helfen wurde, aber sieh Dir folgende Artikel an:

    https://books.google.bg/books?id=Y0gnCgAAQBAJ&pg=PA104&lpg=PA104&dq=Visual+Basic+how+to+determine+the+number+of+the+disk+on+which+a+particular+drive+is+located.&source=bl&ots=4KO1jQOoMb&sig=u85cDoRjck2g8IvkeLjKVlfBzzM&hl=bg&sa=X&ved=0ahUKEwizqf2t0JDLAhVGEpQKHRt2C44Q6AEIHzAA

    Gruß

    Aleksander


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht,  kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 24. Februar 2016 14:41
  • Hi Aleksander,

    nein, das hilft leider nicht. Die dort aufgeführten Funktionen stehen alle im Zusammenhang mit logischen Laufwerken, denen ein Laufwerksbuchstabe zugeordnet ist.

    Ich benötige eine Aufstellung der physikalischen Datenträger 0..n mit den Namen der darauf befindlichen logischen Laufwerke. Schön wären auch noch Partitionsdaten. Wie viele, wie groß, Namen...

    Gruß Jörg

    Mittwoch, 24. Februar 2016 20:34
  • Hallo Jörg,

    du kannst folgendes Beispiel in Kombination mit folgender Klasse verwenden. Entscheidend dabei ist die Eigenschaft Index der Klasse Win32_DiskDrive.

    Gruss,

    LBB

    • Als Antwort markiert Joerg 55 Freitag, 26. Februar 2016 20:48
    Donnerstag, 25. Februar 2016 22:14
  • Hallo Jörg,

    du kannst die gewünschten Informationen über WMI (System.Management) ermitteln.

    Wenn du dir die Ausgabe anschaust, wirst du alle möglichen Infos finden und die benötigten herauspicken können.

    Vielleicht hilft das weiter...

    Imports System.Management Public Class MyDisks Public Sub GetInfos() Dim disks As Dictionary(Of String, String()) = GetProperties(WMI_Items.Win32_DiskDrive) For Each kvp As KeyValuePair(Of String, String()) In disks Console.WriteLine($"ID: {kvp.Key}:") If kvp.Value IsNot Nothing Then For Each value As String In kvp.Value Console.WriteLine($" Value: {value}") Next Else Console.WriteLine($" Value: Nothing") End If Next End Sub

    Public Enum WMI_Items Win32_CDROMDrive Win32_DiskDrive Win32_FloppyDrive Win32_PhysicalMedia Win32_TapeDrive End Enum Public Shared Function GetProperties(ByVal WMI_Item As WMI_Items) As Dictionary(Of String, String()) Dim MOS As ManagementObjectSearcher = New ManagementObjectSearcher("Select * from " & WMI_Item.ToString) Dim MOC As ManagementObjectCollection = MOS.Get Dim MO As ManagementObject Dim PD As PropertyData Dim HWList As New Dictionary(Of String, String()) For Each MO In MOC For Each PD In MO.Properties If Not PD.Value Is Nothing Then If HWList.ContainsKey(PD.Name) = False Then HWList.Add(PD.Name, GetProperty(WMI_Item, PD.Name)) End If End If Next Next Return HWList End Function Public Shared Function GetProperty(ByVal WMI_Item As WMI_Items, ByVal PropertyName As String) As String() Dim MOS As ManagementObjectSearcher = New ManagementObjectSearcher("Select " & PropertyName & " from " & WMI_Item.ToString) Dim MOC As ManagementObjectCollection = MOS.Get Dim MO As New ManagementObject Dim Values As New List(Of String) Try For Each MO In MOC Values.Add(MO.GetPropertyValue(PropertyName)) Next Catch ex As Exception Return Nothing End Try Return Values.ToArray End Function End Class

    Gruß


    • Bearbeitet K. Pater Donnerstag, 25. Februar 2016 22:25
    • Als Antwort markiert Joerg 55 Freitag, 26. Februar 2016 20:33
    Donnerstag, 25. Februar 2016 22:24
  • Hi K.

    besten Dank, anhand deines Codebeispiels bekomme ich die für mich relevanten Daten auf jeden Fall schon einmal angezeigt. Genauer schauen muss ich noch, wie ich direkt auf die von mir benötigten Informationen zugreifen kann. Aber das ist nur noch Fleißsache.

    Falls eventuell Mitleser den Code ausprobieren möchten sei noch gesagt, dass sich in die oberste Prozedur "GetInfos()" noch ein kleiner Fehlerteufel eingeschlichen hat (Reste von C# vermutlich :-) )

    So funktioniert es auch in VB:

        Public Sub GetInfos()
            Dim disks As Dictionary(Of String, String()) = GetProperties(WMI_Items.Win32_DiskDrive)
            For Each kvp As KeyValuePair(Of String, String()) In disks
                Console.WriteLine("ID: " & kvp.Key)
                If kvp.Value IsNot Nothing Then
                    For Each value As String In kvp.Value
                        Console.WriteLine("    Value: " & value)
                    Next
                Else
                    Console.WriteLine("    Value: Nothing")
                End If
            Next
        End Sub

    LG Joerg

    Freitag, 26. Februar 2016 20:43
  • Hi LBB,

    das von dir angegebene Beispiel greift auf die gleichen Ressourcen zu, die in dem unten stehenden Codebeispiel von K. Pater gezeigt werden (oder umgekehrt :-)  ) Auf jeden Fall liefert es die von mir benötigten Daten.

    Besten Dank

    Gruß Joerg

    Freitag, 26. Februar 2016 20:55