C#.NET / Objekt-Orientierte Programmierung mit C#.NET / C#.NET: WMI
![]() |
![]() |
➪ Die Windows Management Instrumentation (WMI) bietet Zugriff auf alle System- und Netzwerkinformationen, Ereignisprotokollen, Laufwerke, Dateisystem, Registry.
Auf dieser Seite: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();
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());
}
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"
mc.Query.QueryString = "select * from win32_LogicalDisk";
// Ausgabe wie oben
mc.Query.QueryString = "select * from
win32_NetworkAdapterConfiguration
where IPEnabled=TRUE";
// Ausgabe wie oben
mc.Query.QueryString = "select * from win32_Service where state='running'";
// Ausgabe wie oben
mc.Query.QueryString = "select * from Win32_Processor";
// Ausgabe wie oben
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 / 4. April 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de