Gebeurtenissen bewaken en erop reageren met standaardconsumenten
U kunt de geïnstalleerde standaardconsumerklassen gebruiken om acties uit te voeren op basis van gebeurtenissen in een besturingssysteem. Standaardgebruikers zijn eenvoudige klassen die al zijn geregistreerd en ze definiëren permanente consumentenklassen. Elke standaardgebruiker voert een specifieke actie uit nadat deze een gebeurtenismelding heeft ontvangen. U kunt bijvoorbeeld een exemplaar van ActiveScriptEventConsumer definiëren om een script uit te voeren wanneer vrije schijfruimte op een computer verschilt van een opgegeven grootte.
WMI compileert de standaardgebruikers in standaardnaamruimten die afhankelijk zijn van het besturingssysteem, bijvoorbeeld:
- In Windows Server 2003 worden alle standaardgebruikers standaard gecompileerd in de naamruimte Root\Subscription.
Notitie
Zie de secties Opmerkingen en Vereisten van elk klasseonderwerp voor de standaardnaamruimten en besturingssystemen die specifiek zijn voor elke WMI-klasse.
In de volgende tabel worden de WMI-standaardgebruikers vermeld en beschreven.
Standaardgebruiker | Beschrijving |
---|---|
ActiveScriptEventConsumer | Hiermee wordt een script uitgevoerd wanneer er een gebeurtenismelding wordt ontvangen. Zie Een script uitvoeren op basis van een gebeurtenisvoor meer informatie. |
LogFileEventConsumer | Hiermee schrijft u aangepaste tekenreeksen naar een tekstbestand wanneer er een gebeurtenismelding wordt ontvangen. Zie Schrijven naar een logboekbestand op basis van een gebeurtenisvoor meer informatie. |
NTEventLogEventConsumer | Hiermee wordt een specifiek bericht vastgelegd in het gebeurtenislogboek van de toepassing. Zie Logboekregistratie naar NT-gebeurtenislogboek op basis van een gebeurtenisvoor meer informatie. |
SMTPEventConsumer | Er wordt een e-mailbericht verzonden met behulp van SMTP telkens wanneer een gebeurtenis wordt verwerkt. Zie E-mail verzenden op basis van een gebeurtenisvoor meer informatie. |
CommandLineEventConsumer | Start een proces wanneer een gebeurtenis wordt geleverd aan een lokaal systeem. Het uitvoerbare bestand moet zich op een veilige locatie bevinden of zijn beveiligd met een sterke toegangsbeheerlijst (ACL) om te voorkomen dat een onbevoegde gebruiker uw uitvoerbare bestand vervangt door een ander uitvoerbaar bestand. Zie Een programma uitvoeren vanaf de opdrachtregel op basis van een gebeurtenisvoor meer informatie. |
In de volgende procedure wordt beschreven hoe u gebeurtenissen kunt bewaken en erop kunt reageren met behulp van een standaardconsumer. Houd er rekening mee dat de procedure hetzelfde is voor een MOF-bestand (Managed Object Format), script of toepassing.
Gebeurtenissen bewaken en erop reageren met een standaardconsumer
Geef de naamruimte in een MOF-bestand op met behulp van de opdracht MOF preprocessor #pragma naamruimte. Geef in een script of toepassing de naamruimte op in de code die verbinding maakt met WMI.
In het volgende voorbeeld van MOF-code ziet u hoe u de naamruimte root\subscription opgeeft.
#pragma namespace ("\\\\.\\root\\subscription")
De meeste intrinsieke gebeurtenissen zijn gekoppeld aan wijzigingen in klasse-exemplaren in de naamruimte root\cimv2. Registergebeurtenissen zoals RegistryKeyChangeEvent worden echter geactiveerd in de root\standaard naamruimte door de *System Registry Provider*.
Een consument kan gebeurtenisklassen opnemen die zich in andere naamruimten bevinden door de naamruimte op te geven in de eigenschap EventNamespace in de __EventFilter-query voor gebeurtenissen. De intrinsieke gebeurtenissen klassen, zoals __InstanceOperationEvent zijn beschikbaar in elke naamruimte.
Een exemplaar van een standaardconsumerklasse maken en vullen.
Dit exemplaar heeft mogelijk een unieke waarde in de eigenschap Name. U kunt een bestaande consument bijwerken door dezelfde naam opnieuw te gebruiken.
InsertionStringTemplates bevat de tekst die moet worden ingevoegd in een gebeurtenis die u opgeeft in EventType-. U kunt letterlijke tekenreeksen gebruiken of rechtstreeks verwijzen naar een eigenschap. Voor meer informatie, zie Standaardtekenreekssjablonen gebruiken en SELECT-instructie voor gebeurtenisquery's.
Gebruik een bestaande bron voor het gebeurtenislogboek dat ondersteuning biedt voor een invoegtekenreeks zonder gekoppelde tekst.
In het volgende voorbeeld van MOF-code ziet u hoe u een bestaande bron van WSH en een EventID waarde van 8 gebruikt.
instance of NTEventLogEventConsumer as $Consumer { Name = "RunKeyEventlogConsumer"; SourceName = "WSH"; EventID = 8; // Warning EventType = 2; // One string supplies the entire message NumberOfInsertionStrings = 1; // the %Hive% and %KeyPath% are properties of // the RegistryKeyChangeEvent instance InsertionStringTemplates = {"The key %Hive%\\%RootPath% has been modified." "Check if the change is intentional"}; };
Maak een exemplaar van __EventFilter en definieer een query voor gebeurtenissen.
In het volgende voorbeeld bewaakt het filter de registersleutel waar opstartprogramma's zijn geregistreerd. Het bewaken van deze registersleutel is mogelijk belangrijk omdat een niet-geautoriseerd programma zichzelf kan registreren onder de sleutel, waardoor deze wordt gestart wanneer de computer wordt opgestart.
instance of __EventFilter as $Filter { Name = "RunKeyFilter"; QueryLanguage = "WQL"; Query = "Select * from RegistryTreeChangeEvent" " where (Hive = \"HKEY_LOCAL_MACHINE\" and " "RootPath = \"Software\\\\Microsoft\\\\Windows" "\\\\CurrentVersion\\\\Run\")"; // RegistryTreeChangeEvents only fire in root\default namespace EventNamespace = "root\\default"; };
Identificeer een gebeurtenis om te monitoren en maak een gebeurtenisquery.
U kunt controleren of er een intrinsieke of extrinsische gebeurtenis is die wordt gebruikt. Gebruik bijvoorbeeld de RegistryTreeChangeEvent klasse van de registerprovider om wijzigingen in het systeemregister te controleren.
Als er geen klasse bestaat die een gebeurtenis beschrijft die u moet bewaken, moet u uw eigen gebeurtenisprovider maken en nieuwe extrinsische gebeurtenisklassen definiëren. Zie Een gebeurtenisprovider schrijvenvoor meer informatie.
In een MOF-bestand kunt u een alias definiëren voor het filter en de consument. Dit biedt een eenvoudige manier om de exemplaarpaden te beschrijven.
In het volgende voorbeeld ziet u hoe u een alias definieert voor het filter en de consument.
instance of __EventFilter as $FILTER instance of LogFileEventConsumer as $CONSUMER
Maak een exemplaar van __FilterToConsumerBinding om het filter en de consumentenklassen te koppelen. Dit exemplaar bepaalt dat wanneer een gebeurtenis plaatsvindt die overeenkomt met het opgegeven filter, de actie die door de consument is opgegeven, moet plaatsvinden. __EventFilter, __EventConsumeren __FilterToConsumerBinding moeten dezelfde afzonderlijke beveiligings-id (SID) hebben in de eigenschap CreatorSID. Zie Een gebeurtenisfilter binden met een logische consumentvoor meer informatie.
In het volgende voorbeeld ziet u hoe u een exemplaar kunt identificeren op basis van het objectpad of hoe u een alias gebruikt als een verkorte expressie voor het objectpad.
instance of __EventFilter as $FILTER instance of NTEventLogEventConsumer as $CONSUMER
In het volgende voorbeeld wordt het filter aan de consument gekoppeld met behulp van aliassen.
instance of __FilterToConsumerBinding { Filter = $FILTER; Consumer = $CONSUMER; };
U kunt één filter binden aan verschillende consumenten, wat aangeeft dat er bij overeenkomende gebeurtenissen verschillende acties moeten worden uitgevoerd; of u kunt één consument binden aan verschillende filters, wat aangeeft dat de actie moet worden uitgevoerd wanneer gebeurtenissen die overeenkomen met een van de filters plaatsvinden.
De volgende acties worden uitgevoerd op basis van de toestand van consumenten en gebeurtenissen.
- Als een van de permanente consumenten uitvalt, ontvangen andere consumenten een melding.
- Als een gebeurtenis wordt verwijderd, activeert WMI __EventDroppedEvent.
- Als u zich abonneert op deze gebeurtenis, wordt de gebeurtenis geretourneerd die is verwijderd en een verwijzing naar de __EventConsumer staat voor de mislukte consument.
- Als een consument faalt, vuurt WMI __ConsumerFailureEventaf, dat mogelijk meer informatie bevat in de eigenschappen ErrorCode, ErrorDescription en ErrorObject.
Zie Een gebeurtenisfilter binden met een logische consumentvoor meer informatie.
Voorbeeld
In het volgende voorbeeld ziet u de MOF voor een instantie van NTEventLogEventConsumer. Nadat u deze MOF hebt gecompileerd, registreert een poging om een waarde te maken, verwijderen of wijzigen in het registerpad HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run een vermelding in het gebeurtenislogboek van de toepassing, onder de bron 'WSH'.
#pragma namespace ("\\\\.\\root\\subscription")
instance of __EventFilter as $Filter
{
Name = "RunKeyFilter";
QueryLanguage = "WQL";
Query = "Select * from RegistryTreeChangeEvent"
" where (Hive = \"HKEY_LOCAL_MACHINE\" and "
"KeyPath = \"Software\\\\Microsoft\\\\Windows"
"\\\\CurrentVersion\\\\Run\")";
// RegistryTreeChangeEvents only fire
// in root\default namespace
EventNamespace = "root\\default";
};
instance of NTEventLogEventConsumer as $Consumer
{
Name = "RunKeyEventlogConsumer";
SourceName = "WSH";
EventID = 8;
EventType = 2; // Warning
Category = 0;
NumberOfInsertionStrings = 1;
// the %Hive% and %KeyPath% are properties
// of the RegistryKeyChangeEvent instance
InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
"has been modified. Check if the change is intentional"};
};
// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
Filter = $Filter;
Consumer = $Consumer;
};
Verwante onderwerpen