C#.NET / C#.NET: WMI

C#.NET: WMI

C#.NET: WMI

➪ Die Windows Management Instrumentation (WMI) bietet Zugriff auf alle System- und Netzwerkinformationen, Ereignisprotokollen, Laufwerke, Dateisystem, Registry.

Um mit der Klasse System.Management.ManagementObjectSearcher arbeiten zu können, müssen Sie im Projektmappen-Explorer einen Verweis auf System.Management einbinden.


System.Management.ManagementObjectSearcher mc;
mc = new System.Management.ManagementObjectSearcher();

pic/cs_verweis_system_Management.png

User

Das folgende Programm listet die User auf. Um einen ersten Eindruck zu erhalten, genügt die Ausgabe der ToString-Methode (Default) des System.Management.ManagementObject mo.


mc.Query.QueryString = "select Domain, Name from win32_UserAccount";
foreach (System.Management.ManagementObject mo in mc.Get())
{
    Console.WriteLine(mo);
}

Wenn Sie etwas mehr lesen möchten, empfehle ich auch die Auswertung der Properties und Qualifiers. Die Schleife über alle Properties gibt Ihnen deren Namen und Wert zurück. (Die Empfehlung gilt auch für die folgenden Aufrufe.)


foreach (System.Management.ManagementObject mo in mc.Get())
{
  Console.WriteLine(mo);
  foreach (System.Management.PropertyData o in mo.Properties)
  {
    Console.WriteLine("\t{0}\t{1}", o.Name, o.Value);
  }
  foreach (System.Management.QualifierData o in mo.Qualifiers)
  {
    Console.WriteLine("\tQualifierData: {0}\t{1}", o.Name, o.Value);
  }
}

Möchten Sie gezielt einzelne Properties auswerten, so schreiben Sie Ihren Code so:


foreach (System.Management.ManagementObject mo in mc.Get())
{
  Console.WriteLine(mo.Properties["Name"].Value.ToString());
}

Gruppen


mc.Query.QueryString = "select * from win32_Group";
foreach (System.Management.ManagementObject mo in mc.Get())
{
  Console.WriteLine(mo);
  // Erweiterter Aufruf wie oben
}

Sie werden hier so interessante Namen finden wie


"Administratoren"
"Benutzer"
"Distributed COM-Benutzer"
"Ereignisprotokollleser"
"Gäste"
"IIS_IUSRS"
"Leistungsprotokollbenutzer"
"Leistungsüberwachungsbenutzer"
"Remoteverwaltungsbenutzer"
"System Managed Accounts Group"

Laufwerke


mc.Query.QueryString = "select * from win32_LogicalDisk";
// Ausgabe wie oben

Netzwerke


mc.Query.QueryString = "select * from 
                                 win32_NetworkAdapterConfiguration 
                                 where IPEnabled=TRUE";
// Ausgabe wie oben

Dienste


mc.Query.QueryString = "select * from win32_Service where state='running'";
// Ausgabe wie oben

Prozessor


mc.Query.QueryString = "select * from Win32_Processor";
// Ausgabe wie oben

Akkustand

Wenn nach einem Windows-10-Update die Anzeige des Akkustands und die verfügbare Restlaufzeit aus der Taskleiste verschwunden ist, können Sie sich ein individuelles Tool schreiben, das Ihr System mit einem Timer alle 30 Sekunden via WMI checkt.


namespace CSharpSchulung
{
  public class Program
  {
    private static System.Management.ManagementObjectSearcher mc = null;
    /// <summary>Haupteinsprungspunkt der Anwendung</summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {      
      // instanziiert den ManagementObjectSearcher()
      mc = new System.Management.ManagementObjectSearcher();
      mc.Query.QueryString = "select EstimatedChargeRemaining, EstimatedRunTime 
                              from Win32_Battery";
      // instanziiert ein Objekt der Klasse Timer
      System.Timers.Timer t = new System.Timers.Timer();
      // Setzt einen EventHandler auf die Methode 
      t.Elapsed += new System.Timers.ElapsedEventHandler(Zeitpunkt_erreicht);
      // setzt das Intervall, hier: 30 Sekunden
      t.Interval = 30000;
      t.Enabled = true;
      // Startaufruf für die erste Ausgabe
      CheckAktuellerStand();
      // Beenden mit RETURN
      Console.ReadLine();
    }
    /// <summary>Eventhandler für den Timer</summary>
    private static void Zeitpunkt_erreicht(object source, 
                                           System.Timers.ElapsedEventArgs e)
    {
      Console.WriteLine("Check um {0}", e.SignalTime.ToLocalTime());
      // Aufruf für die aktualisierte Ausgabe
      CheckAktuellerStand();
    }
    /// <summary>Aktualisierte WMI-Systemabfrage mit formatierter Ausgabe
    /// </summary>
    private static void CheckAktuellerStand()
    {
      string format = "";
      foreach (System.Management.ManagementObject mo in mc.Get())
      {
        foreach (System.Management.PropertyData o in mo.Properties)
        {
          if (o.Name == "EstimatedChargeRemaining") 
              format = "\t{0}\t{1}";
          else  format = "\t{0}\t\t{1}";
          Console.WriteLine(format, o.Name, o.Value);
        }
      }
    }
  }
}

Die Ausgabe sieht so aus:


    EstimatedChargeRemaining    94
    EstimatedRunTime            305
Check um 17.05.2018 18:55:03
    EstimatedChargeRemaining    94
    EstimatedRunTime            250
Check um 17.05.2018 18:55:33
    EstimatedChargeRemaining    94
    EstimatedRunTime            239

wg / 28. Juli 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/cs_WMI.html