Fragen bezüglich des "ManagementObjectSearcher"

Michael-D

Cadet 3rd Year
Registriert
Nov. 2023
Beiträge
35
Tag zusammen ;)
dachte, dass ich mich mal wieder melde und Euch etwas ärgere :D

Neh, alles gut. Zum Titlel "ManagementObjectSearcher" (MOS) gibt es vermutlich tonnenweise Lektüre zu. Hab darüber so einiges gelesen, aber verstehn? Ganz ehrlich: Näh! Genauer gesagt: "Etwas", aber das reicht bei weitem nicht.

Vorab gesagt: Es geht hier nicht um die Einbindung der "System.Management.dll" Datei über die Verweise im Projektmappen-Explorer innerhalb Visual Studio, sondern ich möchte gerne etwas über die Windows Management Instrumentation (WMI) von Euch wissen!

Nehmen wir mal das Beispiel "IP-Adressen!
Manchmal ist es für eine Anwendung erforderlich, spezielle Informationen des Rechners zu kennen, auf dem sie ausgeführt wird. In einer Windows-Umgebung gibt es mehrere Möglichkeiten, diese Informationen zu ermitteln.

1. Beispiel per 'dns.GetHostEntry()

C#:
namespace Console_Get_IP_Address_1
{
    class Program
    {
        static void Main()
        {
            // ===========================================
            // IP-Adresse per "Dns.GetHostEntry()" Abrufen
            // ===========================================
            string hostName = Dns.GetHostName();                                 // Hostnamen des lokalen PC's abrufen
            string my_IP = Dns.GetHostEntry(hostName).AddressList[0].ToString(); // IP-Adresse des lokalen PC's abrufen

            Console.WriteLine(new string('─', 61));
            Console.WriteLine("IP-Adresse per 'Dns.GetHostEntry()' ABRUFEN / 1. Möglichkeit");
            Console.WriteLine(new string('─', 61));
            Console.WriteLine("\nDie IP-Adresse ist.....: " + my_IP);

            IPHostEntry host;
            string local_IP = "?";
            host = Dns.GetHostEntry(Dns.GetHostName()); //

            foreach (IPAddress ip in host.AddressList)  //
            {
                if (ip.AddressFamily.ToString() == "InterNetwork")
                {
                    local_IP = ip.ToString().ToString();
                        Console.WriteLine("Die IPv4-Adresse ist...: " + local_IP);
                }
           }
        }
    }
}
// Ausgabe...
// Die IP-Adresse ist.....: fe80::b22a:8095:de11:1eb7%15
// Die IPv4-Adresse ist...: 192.168.2.105

Da gibts noch andere Beispiele "ip.AddressFamily" oder "Socket.LocalEndPoint" oder "Linq " etc. , aber das ist nicht das, worauch ich eingehen will. Vielmehr ist es der Weg über den WMI, also per Klasse "ManagementObjectSearcher".

2. Beispiel per 'ManagementObjectSearcher Jetzt wirds kompliziert!
C#:
namespace Console_Get_IP_Address_3_MMO
{
    class Program
    {
        static void Main(string[] args)
        {
            // Abfrage definieren (WQL Abfrage über WMI)
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
            // Abfrage ausführen
            ManagementObjectCollection results = searcher.Get();
            // Ergebnisse ausgeben
            foreach (ManagementObject obj in results)
            {
                string[] gateways = (string[])obj["DefaultIPGateway"];
                if (gateways != null && gateways.Length > 0)
                {
                    foreach (string gateway in gateways)
                    {
                        Console.WriteLine("Gateway-IP-Adresse: " + gateway);
                    }
                }
            }
            Console.ReadKey();
        }
    }
}

// Ausgabe für Variable 'gateway':
// Gateway-IP-Adresse: 192.168.2.1
// Gateway-IP-Adresse: fe80::1
Hier funktioniert die Ausgabe der Variable "gateway" gut.

Anders ist es bei folgendem Beispiel, wo mir das Auslesen einiger Variablen nicht verständlich ist...
3. Beispiel per 'ManagementObjectSearcher
C#:
class Program
    {
        static void Main() //(string[] _1)
        {
            string[] Adressen;
            string[] SubnetMasken;
            string[] DefaultGateways;
            string NetworkCard;
            string MACAddress;

            // WQL Abfrage
            ManagementObjectSearcher moSearch = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
            ManagementObjectCollection moCollection = moSearch.Get();
             // Abfrage ausführen
 
           // foreach (ManagementObject mo in moCollection) // Statt "moCollection" geht auch "moSearch.Get()"
            foreach (ManagementObject mo in moSearch.Get())
           {
            Adressen             = (string[])mo["IPAddress"];
            SubnetMasken    = (string[])mo["IPSubnet"];
            DefaultGateways = (string[])mo["DefaultIPGateway"];
            NetworkCard     = mo["Description"].ToString();
            MACAddress      = mo["MACAddress"].ToString();

            // Ausgabe
            Console.WriteLine("IP-Adresse..........: " + mo["IPAddress"].ToString());
            Console.WriteLine("Netzwerkkarte.......: " + mo["Description"].ToString());
            Console.WriteLine("MAC Adresse.......  : " + mo["MACAddress"].ToString());
          }

Hier sind diese Ausgabe ein "System.String[]"...
C#:
Console.WriteLine("IP-Adresse..........: " + mo["IPAddress"].ToString());

Das gleiche gilt für...
C#:
SubnetMasken    = (string[])mo["IPSubnet"];
DefaultGateways = (string[])mo["DefaultIPGateway"];

Aber warum??? Ich könnte ja zum Beispiel die Deklaration von...
C#:
Adressen = (string[])mo["IPAddress"]
einfach ändern auf
C#:
string[] addresses = (string[])mo["IPAddress"];

...und komme zum gleichen Ergebnis! Da es sich ja hier im Arrays handelt, verstehe ich nicht, warum ".ToString();" hier funktioniert und zum Beispiel "string[] Adressen;" nicht!

4. Beispiel per 'ManagementObjectSearcher Noch ein etwas anderes Beispiel
C#:
ManagementObjectSearcher mos = new ManagementObjectSearcher("select IPAddress,IPEnabled from win32_NetworkAdapterConfiguration where IPEnabled=true");
            ManagementObjectCollection moc = mos.Get();
            foreach (ManagementObject mo in moc)
            {
                Console.WriteLine("\nVariable = {0} / IP Aktiv: {1} ", mo["IPAddress"], mo["IPEnabled"]);
                Console.WriteLine("IP-Adresse " + (string[])mo["IPAddress"],mo["IPEnabled"]);;
            }

          Console.WriteLine("\n[Enter] zum Beenden drücken...");
          Console.ReadKey(); // Auf Tastendruck warten


Könnte mir bitte jemand sagen, was da nicht funktioniert?

Schönen Abend Euch allen und Danke für eure Mühe... :schluck:
 
Zuletzt bearbeitet:
Hier sind diese Ausgabe ein "System.String[]" (..) Aber warum???
Weil du ToString() auf einem System.String[] Objekt aufrufst, welches standardmäßig den Typ zurückgibt.

System.Object:
C#:
/// <summary>Returns a string that represents the current object.</summary>
/// <returns>A string that represents the current object.</returns>
public virtual string? ToString()
{
    // The default for an object is to return the fully qualified name of the class.
    return GetType().ToString();
}

Wenn du den eigentlichen String haben möchtest, musst du entsprechend darauf zugreifen, z.B.

C#:
Console.WriteLine("IP-Adresse..........: " + ((string[])mo["IPAddress"])[0]); // mo["IPAddress"].Length > 0

Weiß nicht, ob ich dich da richtig verstehe, aber falls du
C#:
string[] addresses = (string[])mo["IPAddress"].ToString(); //error
versuchst, das funktioniert nicht, weil ToString() kein Array zurückgibt, deswegen kannst du es auch keiner Arraydeklaration zuweisen
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Michael-D
Ich möchte mich ganz herzlich bei Dir bedanken, es funktioniert ;)

Ich werde das Thema hier ab morgen noch ergänzen, da ich noch einige Fragen dazu habe und man mir hoffentlich den richtigen Schubs in die Richtung gibt, denn gerade dieses Thema MOS ist so ziemlich komplex und nicht alles steht in der Microsoft Seite.
 
Hallo,

(Dies sind zusätzliche Informationen für diejenigen, die sich für dieses Thema interessieren.)

WMI ist WQL () kombiniert mit der NET-Umgebung. Wenn Sie der Meinung sind, dass Sie auf der Website von Microsoft nicht viele Details zu WMI finden, können Sie diese Anwendung ausprobieren.

Schauen wir uns die folgende Erklärung von Microsoft an :

Die WMI-Abfragesprache (WMI Query Language, WQL) ist Teil der ANSI SQL (American National Standards Institute Structured Query Language) mit geringfügigen Semantikänderungen.


Dies bedeutet, dass wir in irgendwo im Betriebssystem Abfragen durchführen können. Natürlich im richtigen Umfeld + SQL Dialekt.


1) Win + R
2) wbemtest + Enter


1709907281296.png


Der Name der angezeigten Fenter ist "Windows Management Instrumentation Tester".

3) Klicken Sie oben rechts in der Anwendung auf dem Button "Connect".

1709907368998.png


4) Nochmal : Klicken Sie oben rechts in der Anwendung auf dem Button "Connect". (Wenn Sie in diesem Fenster keine speziellen abfragen werden, lassen Sie den Fenster unverändert.)


1709907392119.png



5) Klicken Sie auf dem Button "Query", die sich fast in der Mitte des angezeigten Fensters befindet.


1709907417883.png



In diesem Schritt erscheint ein Fenster, in dem Sie Ihre Erfahrungen in Form einer Abfrage durchführen können, bevor Sie WMI in einer .NET-Umgebung verwenden. Machen Sie sich keine Sorgen, wenn Ihre Abfragen als Fehler zurückkommen. Das ist nur Rückmeldung.

Auch wenn es sich um eine Testumgebung aussieht, würde ich Ihnen nicht empfehlen, in dem Fenster Änderungen anwenden, die Ihnen nicht bekannt sind, es sei denn, Sie möchten ernsthafte Probleme mit Ihrem Betriebssystem haben.

MfG / Best Regards
 
  • Gefällt mir
Reaktionen: Michael-D
SELECT * FROM Win32_Thread

Führen Sie die obige Abfrage aus und doppelklicken Sie dann auf einen der angezeigten Ergebnisliste Fenster. Ich konnte den Ergebnisfenster (Ergebnisliste Fenster mit die Einstellungen und Detail) dieser Anwendung in der Anwendung unter dem von Ihnen gesendeten Link nicht finden.
 
  • Gefällt mir
Reaktionen: Michael-D
Ich habe ChatGPT noch nie bei der Entwicklung von Software verwendet. Bitte sprechen Sie auf dieser Ebene mit dem, der ChatGPT benutzt, nicht mit mir.

Sie kennen mich nicht und ich finde es sehr interessant, dass Sie einen so unrealistischen Kommentar über mich geschrieben haben.

Ich kann keine weitere Antwort auf Ihre Kommentare auf dieser Ebene finden.

Trotzdem Danke.
 
Zuletzt bearbeitet von einem Moderator:
Deine Kommentare hier entsprechen exakt dem ChatGPT-Duktus. Das liegt am gestelzten Schreibstil und am unpassenden Siezen. Vielleicht ist es aber auch nur eine schlechte Übersetzung. Da würde ich dann empfehlen, ein Forum zu besuchen, in dessen Sprache man sich ohne Übersetzer verständigen kann.
 
Wenn ich meine Anwendungen mit ChatGPT entwickelt hätte, wäre ich einen Expert auf ChatGPT-Duktus, wie eine/r mit ChatGPT Softwareentwickler. Ich sehe, dass Sie mit mir immer noch in einem persönlichen Konflikt sind. Mein Ziel ist, Menschen in der Softwareentwicklung zu unterstützen. Ich frage nicht, woher Sie dies Repekt gefunden haben, meine Sprache öffentlich zu kritisieren.

Mit jemandem wie Ihnen, der sich über Menschen ohne Information einen Kommentar zu schreiben, habe ich nichts mehr zu tun. Sie können schreiben, was Sie wollen.
 
Mein Ziel war es nur, den Bedürftigen zu helfen. Die von mir verwendeten Sätze können Fehler enthalten. Ich wäre Ihnen sogar dankbar, wenn Sie mich per Privatnachricht über dieses Problem informiert hätten.

Um niemanden mit meiner Hilfe und Sprache weiter zu stören, werde ich, wie Sie gesagt haben, meine Mitgliedschaft aus dem Forum löschen.

Es tut mir leid, wenn ich Sie oder andere gestört habe.
 
  • Gefällt mir
Reaktionen: Michael-D
Ach komm!!! Ist doch alles gut. Niemand will Dich vergraulen, am wenigsten ich. Deine Antwort (und die der anderen) haben mir echt gut geholfen. Nochmals vielen Dank dafür ;)

Und nun beruhigen wir uns wieder, denn wir brauchen MITEINANDER und NICHT GEGENEINANDER! Sitzen doch alle in einem Boot, oder nicht???

Micha ;)
 
Zurück
Oben