Erkunden der Windows-Verwaltungsinstrumentierung in C #

In diesem Artikel werde ich einen Einblick in die WMI-Technologie geben und erläutern, wie Sie mit WMI mithilfe der WMI-Abfragesprache in C # arbeiten können. Ich werde dann ein Szenario diskutieren, in dem Sie WMI in der realen Welt einsetzen können.

Was ist WMI?

WMI ist die Abkürzung für Windows Management Instrumentation, eine COM-basierte Microsoft-Technologie zum Abrufen systembezogener Informationen. Mit dieser Technologie können Sie die CPU-ID, MAC-ID usw. Ihres Systems abrufen. Es besteht aus einer Sammlung von Typen, die als Wrapper um die nativen Typen fungieren, um hardwarebezogene Informationen abzurufen. WMI ermöglicht eine Kommunikation auf niedriger Ebene mit dem Host-Betriebssystem. Sie können WMI verwenden, um mit Leistungsindikatoren zu arbeiten oder Hardwareinformationen von einem System abzurufen.

Sie können WMI verwenden, um Metadateninformationen Ihrer Systemhardware wie folgt abzurufen:

  1. HDD-Seriennummer
  2. Festplattengrößen
  3. HDD Freier Speicherplatz
  4. CPU-Seriennummer
  5. CPU-Taktrate
  6. CPU-Sockeltyp
  7. MAC-Adresse des Netzwerkadapters
  8. Netzwerkadapter-Standardgateway

Wir haben genug theoretische Informationen - lassen Sie uns nun einen Code untersuchen.

WMI in C # programmieren

Das folgende Codefragment verwendet eine WQL-Abfrage, um eine Liste mit den Namen der logischen Datenträger in Ihrem System zu füllen. Eine typische WMI-Abfrage sieht folgendermaßen aus:

Select * FROM Win32_Processor

Wie Sie im Code-Snippet sehen können, wird die SelectQuery-Klasse zum Formulieren einer WQL-Abfrage verwendet.

static List PopulateDisk()

        {

            List disk = new List();

            SelectQuery selectQuery = new SelectQuery("Win32_LogicalDisk");

            ManagementObjectSearcher mnagementObjectSearcher = new ManagementObjectSearcher(selectQuery);

       foreach (ManagementObject managementObject in mnagementObjectSearcher.Get())

            {

           disk.Add(managementObject.ToString());

       }

            return disk;

    }

Beachten Sie, dass Sie den System.Management-Namespace (verfügbar als Teil von System.Management.dll) in Ihr Projekt aufnehmen sollten. Die als Teil dieses Namespace enthaltenen WMI-Klassen umfassen Folgendes:

  1. Win32_LogicalDisk - Diese Klasse stellt eine Datenquelle dar, die dem Speichergerät in Ihrem System entspricht. Mit dieser Klasse können Sie die Seriennummer, den verfügbaren freien Speicherplatz und die anfängliche Größe der Festplatte abrufen.
  2. Win32_NetworkAdapterConfiguration - Diese Klasse repräsentiert die Attribute eines Netzwerkadapters in Ihrem System. Mit dieser Klasse können Sie die MAC-Adresse, den IP-Status oder die Standard-IP-Gateway-Informationen abrufen.
  3. Win32_Processor - Diese Klasse repräsentiert den Prozessor, der auf einem System ausgeführt wird, auf dem das Windows-Betriebssystem installiert ist. Mit dieser Klasse können Sie die CPU-ID, den CPU-Status, die CPU-Taktrate usw. der Prozessoren in Ihrem System abrufen.

Um die Metadateninformationen der Festplatten in Ihrem System zu erhalten, dh den Namen, den freien Speicherplatz, die Festplattengröße usw., können Sie den folgenden Code verwenden.

static void GetDiskMetadata()

        {

            System.Management.ManagementScope managementScope = new System.Management.ManagementScope();

            System.Management.ObjectQuery objectQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope,objectQuery);

            ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();

            foreach (ManagementObject managementObject in managementObjectCollection)

            {

                Console.WriteLine("Disk Name : " + managementObject["Name"].ToString());

                Console.WriteLine("FreeSpace: " + managementObject["FreeSpace"].ToString());

                Console.WriteLine("Disk Size: " + managementObject["Size"].ToString());

                Console.WriteLine("---------------------------------------------------");

            }

        }

Das folgende Codefragment zeigt, wie Sie die Volume-Seriennummer der Festplatten in Ihrem System abrufen können.

static string GetHardDiskSerialNumber(string drive = "C")

        {

            ManagementObject managementObject = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");

            managementObject.Get();

            return managementObject["VolumeSerialNumber"].ToString();

        }

Um die Prozessor-ID des Prozessors in Ihrem System abzurufen, müssen Sie die "Prozessor-ID" im Eigenschaftenarray der ManagementObject-Klasseninstanz angeben, wie im folgenden Codeausschnitt gezeigt.

Zeichenfolge processorId = managementObject.Properties ["ProcessorId"]. Value.ToString ();

Um die Taktrate des Prozessors in Ihrem System zu ermitteln, müssen Sie die "CurrentClockSpeed" im Eigenschaftenarray der ManagementObject-Klasseninstanz angeben, wie im folgenden Codeausschnitt gezeigt.

Int32 clockSpeed = Convert.ToInt32(managementObject.Properties["CurrentClockSpeed"].Value.ToString());

Nachdem wir uns mit der Programmierung von WMI mit C # befasst haben, möchte ich Ihnen ein praktisches Beispiel nennen, in dem Sie WMI verwenden können. In einigen meiner Projekte habe ich WMI tatsächlich verwendet, um die Knotensperre zu implementieren - eine Funktion, die verhindert, dass eine Anwendung auf ein anderes System kopiert und auf diesem ausgeführt wird.

Knotensperre

Lassen Sie mich erklären, was ich getan habe, um die Knotensperre zu implementieren, und warum sie benötigt wurde. Das Sperren von Knoten impliziert das Sperren eines Knotens - ein Knoten ist nur ein System. Im Wesentlichen verhindert dieses Konzept, dass eine von Ihrer Anwendung generierte ausführbare Datei auf mehreren Systemen installiert und ausgeführt wird. Ich habe WMI verwendet, um die Hardwaredetails des Systems abzurufen, auf dem die Anwendung installiert und ausgeführt werden muss. Als nächstes wurden diese Details unter Verwendung eines Verschlüsselungsalgorithmus verschlüsselt und dann ein eindeutiger Aktivierungscode für dieses System generiert. Dieser Code muss dann verwendet werden, um die Anwendung zu aktivieren. Beachten Sie, dass die Knoten-ID oder der Aktivierungscode eindeutig sind, da sie aus einer Kombination der CPU-ID und der MAC-ID des Systems bestehen, auf dem die Anwendung installiert und ausgeführt werden sollte.