Naplózás az NT-eseménynaplóba esemény alapján
Az NTEventLogEventConsumer osztály egy adott esemény bekövetkezésekor üzenetet ír a Windows eseménynaplójába. Ez az osztály a WMI által biztosított szokásos eseményfelhasználó.
Megjegyzés
A hitelesített felhasználók alapértelmezés szerint nem naplózhatják az eseményeket az alkalmazásnaplóba egy távoli számítógépen. Ennek eredményeképpen a jelen témakörben ismertetett példa sikertelen lesz, ha a NTEventLogEventConsumer osztály UNCServerName tulajdonságát használja, és egy távoli számítógépet ad meg értékként. Az eseménynaplók biztonságának módosításáról ebben a tudásbáziscikkbenolvashat.
A standard fogyasztó használatának alapvető eljárását A standard fogyasztókkalesemények monitorozása és megválaszolása című cikk ismerteti. Az alábbi lépések az NTEventLogEventConsumer osztály használatakor szükséges alapműveleten túli lépések. A lépések azt ismertetik, hogyan hozhat létre olyan eseményfelhasználót, amely az alkalmazás eseménynaplójába ír.
Az alábbi eljárás azt ismerteti, hogyan hozhat létre olyan eseményfelhasználót, amely az NT-eseménynaplóba ír.
Olyan eseményfelhasználó létrehozása, amely a Windows-eseménynaplóba ír
Felügyelt objektumformátumú (MOF) fájlban hozzon létre egy példányt NTEventLogEventConsumer a lekérdezésben kért események fogadásához. Az MOF-kód írásáról további információt Felügyelt objektumformátumú (MOF) osztályokcímű témakörben talál.
Hozzon létre és nevezze el a __EventFilteregy példányát, majd hozzon létre egy lekérdezést az NT-eseménynaplóba írást kiváltó esemény típusának megadásához.
További információért lásd: Lekérdezés WQL-el.
Hozzon létre egy __FilterToConsumerBinding példányt, hogy a szűrőt társítsa az NTEventLogEventConsumerpéldánnyal.
Az MOF-fájl fordítása Mofcomp.exehasználatával.
Az ebben a szakaszban szereplő példa MOF-kódban található, de a példányokat programozott módon is létrehozhatja a WMI- Scripting API vagy a WMI COM API használatával. A példa bemutatja, hogyan hozhat létre egy fogyasztót az alkalmazás eseménynaplójába való íráshoz az NTEventLogEventConsumerhasználatával. Az MOF létrehoz egy "NTLogCons_Example" nevű új osztályt, egy eseményszűrőt, amely lekérdezi az új osztály egy példányán a műveleteket, például a létrehozást, valamint egy kötést a szűrő és a fogyasztó között. Mivel az MOF utolsó művelete egy NTLogCons_Example-példány létrehozása, az esemény azonnal megjelenik az Alkalmazás eseménynaplójában a Eventvwr.exefuttatásával.
A EventID=0x0A for SourceName="WinMgmt"
az alábbi szöveggel azonosít egy üzenetet. A "%1", "%2", "%3" az InsertionStringTemplates tömbben megadott megfelelő sztringek helyőrzői.
Event filter with query "%2" could not be [re]activated in
namespace "%1" because of error %3. Events may not be delivered
through this filter until the problem is corrected.
Az alábbi eljárás a példa használatát ismerteti.
A példa használatához
Másolja az alábbi MOF-listát egy szövegfájlba, és mentse .mof kiterjesztéssel.
A Parancsablakban fordítsa le az MOF-fájlt a következő paranccsal:
Mofcompfájlnév**.mof**
Futtassa Eventvwr.exe. Tekintse meg az alkalmazás eseménynaplóját. Meg kell jelennie egy 10-es azonosítójú eseménynek (EventID), Forrás = "WMI" és Típus = Hiba.
Kattintson duplán a Információtípus üzenetre a WMI-ből, a 10-essel az Esemény oszlopban. Az eseményhez a következő leírás jelenik meg.
Event filter with query "STRING2" could not be [re]activated in namespace "STRING1" because of error STRING3. Events cannot be delivered through this filter until the problem is corrected.
// Set the namespace as root\subscription.
// The NTEventLogEventConsumer is already
// compiled in the root\subscription namespace.
#pragma namespace ("\\\\.\\Root\\subscription")
class NTLogCons_Example
{
[key] string name;
string InsertionString;
};
// Create an instance of the NT Event log consumer
// and give it the alias $CONSUMER
instance of NTEventLogEventConsumer as $CONSUMER
{
// Unique instance name
Name = "NTConsumerTest";
// System component that generates the event
SourceName = "WinMgmt";
// Event message WBEM_MC_CANNOT_ACTIVATE_FILTER
EventID = 0xC000000A;
// EVENTLOG_ERROR_TYPE
EventType = 1;
// WMI event messages do not have multiple categories
Category = 0;
// Number of strings in InsertionStringTemplates property
NumberOfInsertionStrings = 3;
InsertionStringTemplates =
{"%TargetInstance.Name%",
"%TargetInstance.InsertionString%",
"STRING3"};
};
// Create an instance of the event filter
// and give it the alias $FILTER
// The filter queries for any instance operation event
// for instances of the NTLogCons_Example class
instance of __EventFilter as $FILTER
{
// Unique instance name
Name = "NTLogConsFilter";
Query = "SELECT * from __InstanceOperationEvent"
" WHERE TargetInstance ISA \"NTLogCons_Example\"";
QueryLanguage = "WQL";
};
// Create an instance of the binding
// between filter and consumer instances.
instance of __FilterToConsumerBinding
{
Consumer = $CONSUMER;
Filter = $FILTER;
};
// Create an instance of this class right now.
instance of NTLogCons_Example
{
Name = "STRING1";
InsertionString = "STRING2";
};