Liste aller Codebeispiele
Ein Beispiel zum Einsatz der Klasse System.Management.EventQuery, ManagementEventWatcher aus der .NET-Klassenbibliothek.
Autor: Dr. Holger Schwichtenberg
Beschreibung
Eine Ereignisabfrage (Event Query) unterscheidet sich von einer Datenabfrage dadurch, dass sie nicht sofort ein Ergebnis liefert, sondern Veränderungen an WMI-Objekten durch Ereignisse zurückmeldet.
Aufbau einer Ereignisabfrage
Eine WMI-Ereignisabfrage bezieht sich immer auf einen WMI-Ereignistyp. Mit der WHERE-Klausel werden das zu beobachtende WMI-Objekt und die in dem Objekt zu beobachtenden Attribute definiert.
SELECT * FROM eventklasse WHERE bedingung
Ereignisabfragen unterstützen als zusätzliche SQL-Schlüsselwörter WITHIN, GROUP BY und HAVING:
- Dabei gibt WITHIN 10 das Polling-Intervall in Sekunden an.
- GROUP bündelt eine Anzahl von Einzelereignissen zu einem Gesamtereignis.
- HAVING dient der Definition einer Bedingung innerhalb der Gruppierung.
Bitte beachten Sie, dass das Ereignis __InstanceModificationEvent wirklich nur ausgeführt wird, wenn sich ein Attributwert ändert. Wenn Sie beispielsweise die Prozessorlast auf die Überschreitung der 80%-Grenze prüfen, dann bekommen Sie ein Ereignis beim Überschreiten der Grenze. Wenn danach der Wert konstant bei 100% liegt, bekommen Sie keine weiteren Ereignisse. Sie erhalten erst wieder ein Ereignis, wenn der Wert sich nochmals ändert (z.B. von 100% auf 99%).
Beispiele für Ereignisabfragen
Die folgende Tabelle zeigt Beispiele für WMI-Ereignisabfragen.
WQL Erläuterung
SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_Service" AND TargetInstance.State="Stopped" Alle fünf Sekunden wird geprüft, ob ein Dienst den Status Stopped bekommen hat.
SELECT FROM EmailEvent GROUP
WITHIN 600
HAVING NumberOfEvents > 5 Wenn innerhalb von zehn Minuten mehr als fünf E-Mail-Ereignisse auftreten, wird dieses Ereignis ausgelöst.
SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA "Win32_NTLogEvent" AND TargetInstance.Logfile="Application" OR TargetInstance.Logfile="System"
Jeder neue Eintrag in den Ereignisprotokollen System und Application löst ein Event aus.
Ausführung einer WMI-Ereignisabfrage in .NET
Da die Ergebnisse als Ereignisse eintreffen, unterscheidet sich die Ausführung einer Ereignisabfrage natürlich von der Ausführung einer Datenabfrage.
Die Verwendung einer Ereignisabfrage sieht so aus:
- Zunächst wird ein EventQuery-Objekt erzeugt.
Dim eq As New EventQuery(ABFRAGE)
- Zusätzlich wird ein EventWatcher benötigt, den das EventQuery-Objekt verwendet.
Dim watcher As New ManagementEventWatcher(eq)
- Der EventWatcher bietet ein Ereignis EventArrived(), das an eine Ereignisbehandlungsroutine gebunden werden muss.
AddHandler watcher.EventArrived, AddressOf EreignisBehandlung
- Dann wird der EventWatcher gestartet.
watcher.Start()
- Während das Hauptprogramm wartet, ruft der EventWatcher die entsprechende Ereignisbehandlungsroutine unter Angabe der Ereignisdaten auf.
Public Sub EreignisBehandlung(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
Beispiel
Im folgenden Listing werden Zustandsänderungen in den Windows-Diensten überwacht.
Programmcodebeispiele Visual Basic .NET (VB.NET)
' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Ereignisabfrage für Dienste
' (C) Holger@Schwichtenberg.de
' ============================
Sub wmi_ereignisabfrage()
Const ABFRAGE = "SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Service'"
' --- Abfrage definieren
Dim eq As New EventQuery(ABFRAGE)
' --- Überwachung definieren
Dim watcher As New ManagementEventWatcher(eq)
' --- Ereignisbehandlungsroutine festlegen
AddHandler watcher.EventArrived, _
AddressOf EreignisBehandlung
' --- Überwachung starten
watcher.Start()
MsgBox("Klicken Sie hier, um Überwachung zu beenden!")
watcher.Stop()
End Sub
Public Sub EreignisBehandlung(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
Dim mo As ManagementBaseObject
Dim p As PropertyData
Dim wert As Object
mo = e.NewEvent
out("Veränderung in Dienst: " & mo.ClassPath.Path)
For Each p In mo.Properties
wert = p.Value
If Not wert Is Nothing Then
out(p.Name & "=" & wert.ToString())
Else
out(p.Name & "= (nicht belegt)")
End If
Next
End Sub
Programmcodebeispiele CSharp (C#)
using System;
using System.Management;
using System.Windows.Forms;
using FCL_Buch;
namespace FCL_Buch._System_Management {
public class Samples_WMI_Abfragen {
public void WMI_Ereignisabfrage() {
// Ereignisabfrage für Dienste
string abfrage = "SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Service'";
// Abfrage definieren
EventQuery eq = new EventQuery(abfrage);
// Überwachung definieren
ManagementEventWatcher watcher = new ManagementEventWatcher(eq);
// Ereignisbehandlungsroutine festlegen
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
// Überwachung starten
watcher.Start();
MessageBox.Show("Klicken Sie hier, um die Überwachung zu beenden!");
watcher.Stop();
}
}
}
Querverweise
Definition '.NET Framework Class Library'
Verfügbarkeit der Klasse 'System.Management'
Übersicht über den FCL-Namensraum 'System.Management'
Portal dotnetframework.de
|
|