Een script uitvoeren op basis van een gebeurtenis
De standaardgebruiker die wordt geïmplementeerd door de ActiveScriptEventConsumer klasse stelt een computer in staat om een script uit te voeren en actie te ondernemen wanneer belangrijke gebeurtenissen optreden om ervoor te zorgen dat een computer automatisch problemen kan detecteren en oplossen.
Deze consument wordt standaard geladen in de root\subscription naamruimte.
U kunt de prestaties van alle exemplaren van ActiveScriptEventConsumer op een systeem configureren door de waarden van de Timeout of de MaximumScripts in een enkel exemplaar van ScriptingStandardConsumerSettingin te stellen.
De basisprocedure voor het gebruik van standaardgebruikers is altijd hetzelfde en bevindt zich in Bewaking en reageren op gebeurtenissen met standaardconsumenten. De volgende procedure die wordt toegevoegd aan de basisprocedure, is specifiek voor de ActiveScriptEventConsumer-klasse en beschrijft hoe u een gebeurtenisconsumer maakt die een script uitvoert.
Waarschuwing
De klasse ActiveScriptEventConsumer heeft speciale beveiligingsbeperkingen. Deze standaardgebruiker moet worden geconfigureerd door een lokaal lid van de groep Administrators op de lokale computer. Als u een domeinaccount gebruikt om het abonnement te maken, moet het LocalSystem-account over de benodigde machtigingen voor het domein beschikken om te controleren of de maker lid is van de lokale groep Administrators.
In de volgende procedure wordt beschreven hoe u een gebeurtenisconsumer maakt die een script uitvoert.
Een gebeurtenisconsumer maken die een script uitvoert
Schrijf het script dat moet worden uitgevoerd wanneer er een gebeurtenis plaatsvindt.
U kunt het script in elke taal schrijven, maar zorg ervoor dat een scriptengine voor de taal die u kiest, op uw computer is geïnstalleerd. Het script hoeft geen WMI-scriptobjecten te gebruiken.
Alleen een beheerder kan een scriptconsumer instellen en het script wordt uitgevoerd onder LocalSystem-referenties, wat de consument uitgebreide mogelijkheden biedt, met uitzondering van netwerktoegang. Het script heeft echter geen toegang tot specifieke gebruikersaanmeldingsgegevens, bijvoorbeeld omgevingsvariabelen en netwerkshares.
Maak in het MOF-bestand (Managed Object Format) een exemplaar van ActiveScriptEventConsumer om de gebeurtenissen te ontvangen die u in de query aanvraagt.
U kunt de tekst van het script in ScriptTextplaatsen of u kunt het pad en de bestandsnaam van het script opgeven in ScriptFileName-. Voor meer informatie, zie Ontwerpen van Managed Object Format (MOF) Klassen.
Maak een exemplaar van __EventFilter, geef deze een naam en maak vervolgens een query om het type gebeurtenis op te geven, waardoor het script wordt uitgevoerd.
Zie voor meer informatie Vragen opstellen met WQL.
Maak een exemplaar van __FilterToConsumerBinding om het filter te koppelen aan het exemplaar van ActiveScriptEventConsumer.
Compileer het MOF-bestand met behulp van Mofcomp.exe.
In de voorbeelden in de volgende sectie ziet u twee manieren om een gebeurtenisgestuurd script te implementeren. In het eerste voorbeeld wordt een script gebruikt dat is gedefinieerd in een extern bestand en in het tweede voorbeeld wordt een script gebruikt dat is ingebouwd in de MOF-code. De voorbeelden zijn in MOF-code, maar u kunt de exemplaren programmatisch maken met behulp van de Scripting-API voor WMI- of de COM-API voor WMI.
In de volgende procedure wordt beschreven hoe u het voorbeeld van het externe script gebruikt.
Het voorbeeld van het externe script gebruiken
Maak een bestand met de naam c:\Asec.vbsen kopieer het script in dit voorbeeld erin.
Kopieer de MOF-lijst naar een tekstbestand en sla deze op met de extensie .mof.
Compileer het MOF-bestand in een opdrachtpromptvenster met behulp van de volgende opdracht.
Mofcompbestandsnaam**.mof**
Start de Calculator, waarmee een calc.exe-proces wordt aangemaakt. Wacht meer dan vijf seconden, sluit het venster Rekenmachine en zoek vervolgens in de map C:\ naar een bestand met de naam ASEC.log.
De volgende tekst is vergelijkbaar met de tekst die in het bestand ASEC.log wordt opgenomen.
Time: 12/31/2002 2:56:33 PM; Entry made by: ASEC Application closed. UserModeTime: 1562500; KernelModeTime: 3125000 [hundreds of nanoseconds]
In het volgende VBScript-codevoorbeeld ziet u het script dat wordt aangeroepen wanneer een gebeurtenis wordt ontvangen door de permanente consument. Het TargetEvent-object is een __InstanceDeletionEvent exemplaar, zodat het een eigenschap heeft met de naam TargetInstance. Dit is een Win32_Process exemplaar dat wordt gebruikt om de gebeurtenis te activeren. De klasse Win32_Process bevat de eigenschappen UserModeTime en KernelModeTime die in het logboekbestand worden geplaatst dat door het script is gemaakt.
' asec.vbs script
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\ASEC.log", 8, true)
objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC"
objFile.WriteLine "Application closed. UserModeTime: " & _
TargetEvent.TargetInstance.UserModeTime & _
"; KernelModeTime: " & _
TargetEvent.TargetInstance.KernelModeTime & _
" [hundreds of nanoseconds]"
objFile.Close
In het volgende MOF-codevoorbeeld wordt het script aanroepen wanneer een gebeurtenis wordt ontvangen. Hiermee maakt u het filter, de consument en de binding ertussen in de root\subscription naamruimte.
#pragma namespace ("\\\\.\\root\\subscription")
instance of ActiveScriptEventConsumer as $Cons
{
Name = "ASEC";
ScriptingEngine = "VBScript";
ScriptFileName = "c:\\asec2.vbs";
};
instance of __EventFilter as $Filt
{
Name = "EF";
Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.Name = \"calc.exe\"";
QueryLanguage = "WQL";
EventNamespace = "root\\cimv2";
};
instance of __FilterToConsumerBinding
{
Filter = $Filt;
Consumer = $Cons;
};
In de volgende procedure wordt beschreven hoe u het voorbeeld van het inlinescript gebruikt.
Het voorbeeld van het inlinescript gebruiken
Kopieer de MOF-lijst in deze sectie naar een tekstbestand en sla deze op met de extensie .mof.
Compileer het MOF-bestand in een opdrachtpromptvenster met behulp van de volgende opdracht.
Mofcompbestandsnaam**.mof**
In het volgende voorbeeld van MOF-code worden zowel het filter, de consumentcomponent, en de binding ertussen gemaakt en de script-inhoud is ook inline.
#pragma namespace ("\\\\.\\root\\subscription")
instance of ActiveScriptEventConsumer as $Cons
{
Name = "ASEC";
ScriptingEngine = "VBScript";
ScriptText =
"Dim objFS, objFile\n"
"Set objFS = CreateObject(\"Scripting.FileSystemObject\")\n"
"Set objFile = objFS.OpenTextFile(\"C:\\ASEC.log\","
" 8, true)\nobjFile.WriteLine \"Time: \" & Now & \";"
" Entry made by: ASEC\"\nobjFile.WriteLine"
" \"Application closed. UserModeTime: \" & "
"TargetEvent.TargetInstance.UserModeTime &_\n"
"\"; KernelModeTime: \" & "
"TargetEvent.TargetInstance.KernelModeTime "
"& \" [hundreds of nanoseconds]\"\n"
"objFile.Close\n";
};
instance of __EventFilter as $Filt
{
Name = "EF";
Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
"WHERE TargetInstance ISA \"Win32_Process\" "
"AND TargetInstance.Name = \"calc.exe\"";
QueryLanguage = "WQL";
EventNamespace = "root\\cimv2";
};
instance of __FilterToConsumerBinding
{
Filter = $Filt;
Consumer = $Cons;
};