WMI win32 Klasse, Eigenschaft auf vorhanden sein prüfen?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    WMI win32 Klasse, Eigenschaft auf vorhanden sein prüfen?

    Alter Thread; zur neuen Frage bitte direkt nach ganz unten scrollen, danke.




    Hallo zusammen,

    Ich möchte in meinem Programm haufenweise WMI Informationen anzeigen lassen und brauche auch einige später für diverse Abläufe.
    Ich dachte mir, ich lese es zum Programmstart alles ein und speicher es weg. (Stört nicht wenn der Programmstart um einige Sekunde verzögert wird)
    Mein Ziel ist es eigentlich, später schön bei Bedarf mit IntelliSense arbeiten zu können.

    (Beispiel)
    label1.text = processor.CurrentClockSpeed

    Soweit die Theorie.
    Da ich bis jetzt mit OOP und Klassen nichts am Hut hatte und ich mir jetzt dachte, ich mache es einmal gescheit, bin ich mir nicht sicher ob und wie gut meine Überlegungen dazu sind.
    Ich hatte mir gedacht, ich erstelle eine neue Klassendatei nach folgender Struktur:


    VB.NET-Quellcode

    1. Public Class Processor
    2. Private m_AddressWidth As UInteger 'On a 32-bit operating system, the value is 32 and on a 64-bit operating system it is 64.
    3. Private m_Caption As String 'Short description of an object (a one-line string).
    4. Private m_CurrentClockSpeed As UInteger 'Current speed of the processor, in MHz.
    5. 'bla bla bla
    6. '.....
    7. Public Property AddressWidth As UInteger
    8. Get
    9. Return m_AddressWidth
    10. End Get
    11. Set(ByVal value As UInteger)
    12. m_AddressWidth = value
    13. End Set
    14. End Property
    15. 'bla bla bla
    16. '.....
    17. End Class
    18. Public Class PhysicalMemory
    19. Private m_Capacity 'Total capacity of the physical memory—in bytes.
    20. Private m_Caption 'Short description of the object—a one-line string.
    21. 'bla bla
    22. End Class


    Im Main Form dann etwas wie:

    VB.NET-Quellcode

    1. SysInfoProcessor As New List(Of Processor)



    Soweit zu meinem Konzept. Jetzt frage ich mich, ob das überhaupt etwas taugt.

    Ich bin vorhin noch zufällig über das DataSet gestolpert (wie kann man das nicht, wird von ErfinderDesRades ja ziemlich häuffig vorgeschlagen *g*) und habe gesehen, man kann innerhalb diesem mehrere Tabellen anlegen (also dann für die einzelnen Bestandteile CPU, RAM, etc. jeweils eine einzelne Tabelle). Praktischerweise kann man das scheinbar noch relativ Problemlos mit einem DataGridView verbinden.
    Allerdings entfiele dann IntelliSense und ich wüsste auch nicht, ob ich überhaupt noch gezielt einzelne Informationen abrufen kann?

    Ich freue mich zu hören wie ihr das realisieren würdet.
    Schönen Samstag noch!

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

    Also ich glaube du verstehst nicht ganz was IntelliSense ist, das ist lediglich eine Hilfestellung von MS um dem Programmierer einen guten Programmierfluß bieten zu können.
    Zu den Klassen: Wenn du die Properties nur nach dem Schema hast, also ohne Event raisen oder so, dann kannst du auch Autoproperties nutzen, die funktionieren leider nicht bei ReadOnly, aber egal:

    VB.NET-Quellcode

    1. ​Public Property Test as String

    Mit Dataset bist du erstmal gut beraten, einfach eines per Designer erstellen und dann später an ein DGV binden, der @ErfinderDesRades hat dazu ja schon einiges dokumentiert. Du musst ansonsten nichts großartig machen, bearbeiten tust du es dann übers DGV, speichern einfach per und lesen einfach per Write-/ReadXML.

    YEE schrieb:

    Allerdings entfiele dann IntelliSense und ich wüsste auch nicht, ob ich überhaupt noch gezielt einzelne Informationen abrufen kann?

    Das hängt natürlich in erster Linie davon ab, was genau du speichern willst, wie du es speichern willst und eventuell auch in welchen Mengen(bei 50.000 Einträgen nimmt man dann keine XML mehr ^^).
    Generell kannst du theoretisch auch mit den Daten einer DataRow eine neue Instanz von einer Klasse erstellen und diese dann zum bearbeiten nutzen und später einfach wieder in das Dataset einlesen, das ist dir überlassen.

    LG

    ChOoSeMyNaMe schrieb:

    Also ich glaube du verstehst nicht ganz was IntelliSense ist, das ist lediglich eine Hilfestellung von MS um dem Programmierer einen guten Programmierfluß bieten zu können.
    LG

    Danke Dir schon mal.
    Gute Frage, ich weiß nicht was es bei IntelliSense sonst noch so gibt, außer der Autovervollständigung während der Eingabe.
    Aber genau dass möchte ich haben: ich möchte nicht mit Funktionen arbeiten und dann ständig Nachdenken müssen, wie diese und jene Info nochmal genau hieß.
    Im besten Fall möchte Ich Processor eingeben und alle verfügbaren Werte angezeigt bekommen bspw: CurrentClockSpeed, CurrentVoltage usw.
    Möglicherweise auch SysInfoProcessor., damit bei eingabe von SysIn.. auch schon alle anderen möglichen Komponenten angezeigt werden SysInfoProcessor., SysInfoPhysicalMemory usw.

    Und ich denke mal, das entfiele mit einem DataSet,


    ich verstehe nicht, was dein Proggi machen soll, insbesondere nicht, wie du Intellisense darin verwenden willst.

    Im VisualStudio die Intellisense macht ja im Text-Editor Vorschläge, um bei der freien Text-Eingabe Hilfestellung zu leisten.

    Ist dein Programm auch ein Text-Editor?
    Und was für Texte willst du da verfassen? Emails? Reiseberichte? Zeitungsartikel?
    Ups, wusste gar nicht das ich mich unverständlich ausdrücke ^^
    In erster Linie möchte ich mir grade ein Tool zu Test- und Diagnose Zwecke (für Computer) schreiben.
    Dafür ist es auch ganz nützlich eine Zusammenfassung wichtiger Systeminformationen (cpu, hdd, ram, os, usw...) zu haben und sich diese bei bedarf noch detaillierter anzeigen lassen zu können.

    bis jetzt hatte ich die WMI Abfrage immer in eine Funktion gepackt:

    VB.NET-Quellcode

    1. Public Function GetWMI(ByVal [Class] As String, ByVal [Property] As String) As String
    2. Dim returns As String = ""
    3. Dim searcher As New ManagementObjectSearcher("SELECT * FROM " & [Class])
    4. For Each queryObj As ManagementObject In searcher.Get()
    5. If CStr(queryObj([Property])) <> "" Then : returns = CStr(queryObj([Property])) : Else : returns = "-" : End If
    6. Next
    7. Return returns
    8. End Function


    VB.NET-Quellcode

    1. WMIModel = GetWMI("Win32_Computersystemproduct", "name")


    Allerdings empfinde ich diese Methode mittlerweile als unkonfortable und Fehleranfällig da keine Korrektur von IntelliSense.


    Ich habe mir halt darauf hin wie im ersten Post gezeigt, Testweise eine Klasse erstellt und mal darain rum experimentiert.
    Ich habe gesehen, das meine Klasse(n Objekte?) von IntelliSense berücksichtigt und angezeigt werden, das wollte ich nutzen.

    In etwa so, als würde ich My.Computer.Info. eingeben und dann AvailablePhysicalMemory, AvailableVirtualMemory, OSFullName, OSVersion, etc.. amgezeigt bekommen, nur halt mit wesentlich mehr Informationen.
    Ich hoffe, ich konnte diesmal vermitteln was ich brauch :)
    Bezüglich meines WMI Projektes habe ich eine Frage:

    VB.NET-Quellcode

    1. Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_Processor")
    2. For Each queryObj As ManagementObject In searcher.Get()
    3. label1.Text = queryObj("AssetTag")
    4. Next


    Folgende Eigentschaft ​queryObj("AssetTag") ist nicht auf allen Betriebssysteme vorhanden.
    Diese speziell ist zum Beispiel erst ab Win10 vorhanden. Bei mir mit Win7 wird deshalb sofort folgender Fehler ausgegeben:

    Eine nicht behandelte Ausnahme des Typs "System.Management.ManagementException" ist in System.Management.dll aufgetreten
    Zusätzliche Informationen: Nicht gefunden




    Ich habe da jetzt keine Lust vorher noch dauernd die Betriebssystemversionen abzufragen.
    Wäre in diesem Falle jetzt ​try : catch .. quick'n'dirty (funktioniert nämlich eigentlich unkompliziert), oder gibts da noch eine Möglichkeit solche Fehler im vorraus abzufangen?



    bedanke mich schonmal :)
    Wenn du auch ohne das Ergebnis weiterleben kannst, spricht nichts gegen ein Try/Catch.
    Aber bitte kein generelles, sondern fange nur die ManagementException.
    Du könntest im Catch-Zweig die Ergebnisvariable mit der Fehlermeldung oder mit "N/A" füllen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --