Geht das? WMI Werte aus mehreren Klassen in einer Abfrage auslesen

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von doLob.

    Geht das? WMI Werte aus mehreren Klassen in einer Abfrage auslesen

    Ich habe vermutlich ein Verständnisproblem oder sehe gerade den Wald vor lauter Bäumen nicht.
    Das Abfragen von Properties durch alle Instanzen einer WMI Class bekomme ich hin. Ich möchte aber im gleichen Moment, also in einem Durchlauf Properties aus verschiedenen Classes abrufen.
    Konkret:
    Ich durchlaufe alle Instanzen von "Win32_NetworkAdapterConfiguration" und wenn "IPEnabled" = True ist, lese ich z.B. die IP aus. Nun möchte ich aber zu genau diesem Objekt(Instanz) die "NetConnectionID" mit anzeigen.
    Bisher mache ich das mit einer neuen WMI Abfrage in der Class "Win32_NetworkAdapter" in der ich wieder alle Instanzen durchlaufe und wenn Bedingung erfüllt wird, wird diese angezeigt.
    Geht das auch in einem Zug oder mit direkter Abfrage ohne wieder alle Instanzen durchlaufen zu müssen ?

    MfG
    Mir kommt da nur gerade diese Möglichkeit in den Sinn

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Management
    4. Public Module Module1
    5. Public Sub Main()
    6. WmiIdInfo()
    7. End Sub
    8. Private Function WmiIdInfo() As String()
    9. WmiIdInfo = Nothing
    10. Dim res(1)() As String
    11. Dim _propName As String() = "IPEnabled NetConnectionID".Split
    12. Dim _Queries As String() = "Win32_NetworkAdapterConfiguration Win32_NetworkAdapter".Split
    13. Dim lst As List(Of String), tmp As String
    14. Using mos = New ManagementObjectSearcher
    15. Dim cnt As Integer = 0
    16. For Each quer In _Queries
    17. mos.Query = New SelectQuery(quer)
    18. lst = New List(Of String)
    19. For Each mo As ManagementObject In mos.Get()
    20. If mo.GetPropertyValue(_propName(cnt)) IsNot Nothing Then
    21. lst.Add(mo.GetPropertyValue(_propName(cnt)).ToString)
    22. Else : lst.Add(Nothing)
    23. End If
    24. Next
    25. res(cnt) = lst.ToArray
    26. cnt += 1
    27. Next
    28. End Using
    29. For i As Int32 = 0 To res(0).Length - 1
    30. Console.WriteLine("Index{0}: {1}", i, res(0)(i))
    31. Console.WriteLine("Index{0}: {1}", i, res(1)(i))
    32. Console.WriteLine()
    33. Next
    34. Console.ReadLine()
    35. End Function
    36. End Module


    EDIT:
    Eventuell könnte das ein Ansatz sein
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub WmiIdInfo3()
    2. Dim _propName As String() = "Index NetConnectionID IPEnabled".Split
    3. Dim _queries = New List(Of String) From {"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled='True'"}
    4. For Each mos As ManagementObject In New ManagementObjectSearcher(_queries(0)).Get
    5. _queries.Add(String.Format("ASSOCIATORS OF {0}Win32_NetworkAdapterConfiguration.Index='{2}'{1} WHERE ResultClass = Win32_NetworkAdapter", "{", "}", mos(_propName(0)).ToString))
    6. For Each mos2 As ManagementObject In New ManagementObjectSearcher(_queries.Last).Get
    7. Console.WriteLine("Win32_NetworkAdapter.DeviceID = {0}", mos2(_propName(0)))
    8. Console.WriteLine("Win32_NetworkAdapter.NetConnectionID = {0}", mos2(_propName(1)))
    9. Console.WriteLine("Win32_NetworkAdapterConfiguration.Index = {0}", mos(_propName(0)))
    10. Console.WriteLine("Win32_NetworkAdapterConfiguration.IPEnabled = {0}", mos(_propName(2)))
    11. Console.WriteLine()
    12. Next
    13. Next
    14. End Sub


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    RESPEKT - Geniale Lösung ! Da wär ich nicht drauf gekommen !
    Kannst du mir bitte auch noch verraten wie ich einen Array-Wert z.B. "IPAddress" zur anzeige bringe ?
    Am Ende will ich in meinem Programm die Möglichkeit integrieren, die IP Adresse zu ändern oder auf DHCP umzustellen ohne
    mühsam über die Netzwerkeinrichtung gehen zu müssen.

    MfG
    Ich weiss leider nicht genau, was du meinst? Das vielleicht?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub WmiIdInfo3()
    2. Dim _propName As String() = "Index DeviceID NetConnectionID IPEnabled IPAddress".Split
    3. Dim _queries = New List(Of String) From {"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled='True'"}
    4. For Each mos As ManagementObject In New ManagementObjectSearcher(_queries(0)).Get
    5. _queries.Add(String.Format("ASSOCIATORS OF {0}Win32_NetworkAdapterConfiguration.Index='{2}'{1} WHERE ResultClass = Win32_NetworkAdapter", "{", "}", mos(_propName(0)).ToString))
    6. For Each mos2 As ManagementObject In New ManagementObjectSearcher(_queries.Last).Get
    7. Console.WriteLine("Win32_NetworkAdapter.DeviceID = {0}", mos2(_propName(1)))
    8. Console.WriteLine("Win32_NetworkAdapter.NetConnectionID = {0}", mos2(_propName(2)))
    9. Console.WriteLine("Win32_NetworkAdapterConfiguration.Index = {0}", mos(_propName(0)))
    10. Console.WriteLine("Win32_NetworkAdapterConfiguration.IPEnabled = {0}", mos(_propName(3)))
    11. Console.WriteLine()
    12. Console.WriteLine("Win32_NetworkAdapterConfiguration.IPAddress")
    13. Dim ipadress = DirectCast(mos(_propName(4)), String())
    14. Array.ForEach(ipadress, Sub(s) Console.WriteLine(s))
    15. Console.WriteLine()
    16. Next
    17. Next
    18. End Sub


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()