WMI Abfragen stimmen nicht überein

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    WMI Abfragen stimmen nicht überein

    Moin moin

    Bein meinem Code hier werden mir zwar die Infos ausgegeben aber die Zuordnung stimmt nicht. Ich habe schon so vieles versucht aber alles ohne Erfolg. :(
    Die "ManufactorSerial" wir dem falschen Laufwerk zugewiesen.
    In der Debungausgabe müsste die erste ManufactorSerial beim zweiten stehen. :!:

    VB.NET-Quellcode

    1. Private Sub LoadDatafromWMI()
    2. Try
    3. Dim queryUSBDrive As New SelectQuery("Win32_LogicalDisk", "DriveType=2") ' Filter for(USB)
    4. Dim searcher As New ManagementObjectSearcher(queryUSBDrive)
    5. Dim drives As ManagementObjectCollection = searcher.Get()
    6. Dim manufactorSearcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'")
    7. Dim manufactorDrives As ManagementObjectCollection = manufactorSearcher.Get()
    8. Dim manufactorDriveEnumerator As IEnumerator = manufactorDrives.GetEnumerator()
    9. For Each drive As ManagementObject In drives
    10. If manufactorDriveEnumerator.MoveNext() Then
    11. Dim manufactorDrive As ManagementObject = DirectCast(manufactorDriveEnumerator.Current, ManagementObject)
    12. manufactorSerialNumber = manufactorDrive("SerialNumber").ToString()
    13. volumenSerialNumber = TryCast(drive("VolumeSerialNumber"), String)
    14. volumenLabel = TryCast(drive("VolumeName"), String)
    15. Debug.WriteLine("ManufactorSerial: " & manufactorSerialNumber)
    16. Debug.WriteLine("VolumenSerial: " & volumenSerialNumber)
    17. Debug.WriteLine("VolumenLabel: " & volumenLabel)
    18. Debug.WriteLine("-------------------------------")
    19. Else
    20. Exit For
    21. End If
    22. Next
    23. Debug.WriteLine("Get Infos Successful")
    24. Catch ex As ManagementException
    25. MessageBox.Show("An error occurred: " & ex.Message)
    26. End Try
    27. End Sub


    Debugausgabe:

    XML-Quellcode

    1. ManufactorSerial: C3654318
    2. VolumenSerial: 36F68BA3
    3. VolumenLabel: Bilder
    4. -------------------------------
    5. ManufactorSerial: 03003205062221230832
    6. VolumenSerial: FE07C370
    7. VolumenLabel: Musik
    8. -------------------------------
    9. Get Infos Successful
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Das liegt daran, das die Reihenfolge von Win32_DiskDrive und Win32_LogicalDisk nicht gleich sind, wie genau Windows das Managed kann ich nicht sagen. Ist dir der Unterschied der beiden bekannt? Bzw. was denn da was repräsentiert? Wenn nicht, denk mal drüber nach bevor du den Spoiler aufklappst, ist eigendlich leicht erkennbar.
    Spoiler anzeigen

    Win32_DiskDrive ist z.B. ein USB-Speicherstick(sprich einmal die Hardware). Kann der mehrere Partitionen haben? Ja. Jede Partition wäre Win32_LogicalDisk


    Siehe hier wie man das machen kann:(1. Link C++ Doku, bei WinAPI und WMI(und mehr) immer eine smarte Idee dort nachzuschauen.)
    learn.microsoft.com/en-us/wind…32-logicaldisktopartition
    stackoverflow.com/questions/48…aldisk-with-diskpartition

    (Und da sagen manche die Windows-API macht Kopfschmerzen, xD. von WMI krieg ich glatt Migräne)
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „DTF“ ()

    @DTF
    Kann der mehrere Partitionen haben? Ja.

    Unter Windows 7 geht das nicht, und habe erst vor kurzem gelesen das sowas nun mit Win10/11 möglich ist. Ich sehe da auch nicht wirklich (z.Zt.) keinen logischen Sinn drin.

    Ich habe ja mit dem WMICodeCreator geschaut was wie möglich ist, doch finde ich leider nichts wie ich das anders auslesen kann.

    Ich habe nun schon überlegt, erst den Stick über seine "ManufactorSerial" zu finden, und erst dann die "VolumenSerial" davon auszulesen.
    Ist vielleicht nicht die schönest Lösung aber im Moment weiß ich es nicht besser. ?(


    Edit: 18:15 Uhr :!:

    Vielleicht nicht die schönste Art und Weise aber es klappt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub LoadDataFromWMI()
    2. Try
    3. Dim matchingManufactorDrive As ManagementObject = Nothing
    4. Using manufactorSearcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'")
    5. Dim manufactorDrives As ManagementObjectCollection = manufactorSearcher.Get()
    6. For Each manufactorDrive As ManagementObject In manufactorDrives
    7. manufactorSerialNumber = manufactorDrive("SerialNumber").ToString()
    8. If manufactorSerialNumber = manufactorSerial Then
    9. matchingManufactorDrive = manufactorDrive
    10. Exit For
    11. End If
    12. Next
    13. End Using
    14. If matchingManufactorDrive IsNot Nothing Then
    15. Debug.WriteLine("The right USB stick has been found.")
    16. Debug.WriteLine("ManufactorSerial: " & manufactorSerialNumber)
    17. Using searcher As New ManagementObjectSearcher(New SelectQuery("Win32_LogicalDisk", "DriveType=2"))
    18. Dim drives As ManagementObjectCollection = searcher.Get()
    19. For Each drive As ManagementObject In drives
    20. volumenSerialNumber = TryCast(drive("VolumeSerialNumber"), String)
    21. Debug.WriteLine("VolumenSerial: " & volumenSerialNumber)
    22. Debug.WriteLine("-------------------------------")
    23. Next
    24. End Using
    25. RaiseEvent FoundUSBStick(True)
    26. Else
    27. RaiseEvent FoundUSBStick(False)
    28. Debug.WriteLine("No matching USB stick was found.")
    29. Exit Sub
    30. End If
    31. Catch ex As ManagementException
    32. Debug.WriteLine("An error occurred: " & ex.Message)
    33. End Try
    34. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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