Event Log Adatbázisba töltése

Azt hiszem sokan vagyunk úgy a rendszereinkel, hogy szeretnénk a különböző gépek, szerverek Event Logját egy közös adatbázisban látni. Erre remek módszerek találhatók a Microsoft scripting oldalain. Ezeket a scripteket használva, időzítve kiolvasható az Event Log tartalma. Feltéve viszont azt az esetet, hogy valós időben (amikor az Event Logba a bejegyzés történik) szeretném ezeket megkapni, helyzet már nem is olyan egyszerű. Ahhoz, hogy ezt meg tudjuk tenni segítségül hívjuk a WMI-t (Windows Management Instrumentation). A WMI használható arra, hogy információkat gyűjtsünk a rendszerünkről. Ez az amit mindannyian tudunk, de ennél többet is elérhetünk. Készíthetünk script-eket, programokat amiket a WMI indít el, ha valami történik a rendszerben. Ráadásul ezt olyan módon tehetjük meg, hogy az általunk elhelyezett kód a rendszer újraindítása után is aktív marad. Hogyan érhetjük ezt el? El kell helyeznünk a saját kódunkat a WMI Repository-ba. A WMI Repository egy speciális fájlformátumot használ ami MOF-nak (Management Object File) hívnak. Van egy MOFCOMP-nak nevezett eszközünk ami képes "befordítani" a kódunkat a repository-ba.
Két dolgot kell megírnunk, ha el akarjuk kapni az Event Log-ba írás eseményét. Az egyik a fent említett MOF fájl. Ennek négy fontos része van:
1. A WMI névtér definíció. Ez írja le, hogy hova kerülnek az objektumaink (amiket később fogunk létrehozni). Ez esetünkben a \root\subscription névtér.
2. Az Event Consumer. Ez írja le azt az objektumot amit a rendszer végrehajt, ha valami történik.
3. Az Event Filter. Ez a szűrő írja le az objektumunk hatókörét (nem akarjuk elkapni az összes lehetséges WMI eseményt).
és egy scriptre ami az eseményre reagálva végrehajtja a feladatot, jelen esetben az adatbázisba írást.
A MOF fájl ( ElogSink.mof ):
#pragma namespace ("\\\\.\\root\\subscription")
#pragma autorecover
 
instance of ActiveScriptEventConsumer as $Cons
{
    Name = "EventLogSink";
    ScriptingEngine = "JScript";
    ScriptFileName = "c:\\Scripts\\WMI\\ElogSink.js";
};
 
instance of __EventFilter as $Filt
{
    Name = "ELogSinkFilt";
    Query = "SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA \"Win32_NTLogEvent\" ";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};
 
instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};
A mof fájlban az aláhúzott string jelöli, a következő VBScript teljes elérési útvonalát. ezt C stíulsú stringként ki kell javítani a megfelelő elérési útra.
A VBScript ( ElogSink.vbs ):
Dim objConn
Dim objRS
Dim objEvent
 
'Adatbázis megnyitása
Set objConn = CreateObject("ADODB.Connection")
objConn.Open "Provider='sqloledb';Data Source='MSSQL';Initial Catalog='EventLog';Integrated Security='SSPI';"
 
'RecordSet megnyitása
Set objRS = CreateObject("ADODB.Recordset")
objRS.CursorLocation = 2    'Szerver oldali cursor
objRS.Open "SELECT * FROM EventTable WHERE 1 = 2" , objConn, 2, 3
 
'Kérjük le a WMI által átadott Event Log bejegyzést
Set objEvent = TargetEvent.TargetInstance
 
'Pakoljuk be az adatbázisba
objRS.AddNew
objRS("Category") = objEvent.Category
objRS("ComputerName") = objEvent.ComputerName
objRS("EventCode") = objEvent.EventCode
objRS("Message") = objEvent.Message
objRS("RecordNumber") = objEvent.RecordNumber
objRS("SourceName") = objEvent.SourceName
objRS("TimeWritten") = objEvent.TimeWritten
objRS("Type") = objEvent.Type
objRS("User") = objEvent.User
objRS("EventType") = objEvent.EventType
objRS("Logfile") = objEvent.LogFile
objRS.Update
 
'Zárjunk be mindent
objRS.Close
objConn.Close
Miután a fenti két kódocskát elhelyeztük a rendszerben, létrehoztuk az adatbázist, már csak egy feladatunk maradt, befordítani a MOF fájlunkat a WMI Repository-ba.
Ezt a következő paranccsal tehetjük meg:
mofcomp ElogSink.mof
Ettől kezdve az Event Log bejegyzések az adatbázisunkban is megjelennek.   A fenti kód a Microsoft SQL vagy MSDE verziót mutatja be. Természetesen az adatbázis Conncetion Stringet (aláhúzott sor) ki kell javítani a valós adatbázis elérésre. (ide hiányzik a tábladefiniciós SQL script) Természetesen nem mindenki Használ Microsoft SQL szervert. A tavábbiakban leírom, hogy mit kell módosítani abban az esetben, ha az adatbázis egy MySQL szerveben található. MySQL esetén a VBScriptben az aláhúzott connection stringes sor így fog kinézni:
objConn.Open "Provider=MSDASQL;Driver={MySQL ODBC 3.51 Driver};UID=xxxx;PWD=zzzz;SERVER=yyyyyy;DB=eventlog;OPTION=3"
Természetesen ebben a Connection Stringben is ki kell javítani a paramétereket a valós környezetre (felhasználó név, jelszó, szerver neve). Nagyon fontos, hogy a stringben található OPTION=3 benne maradjon, ellenkező esetben az eszköz az adatbázis írásakor furcsa hibákat fog generálni. A fentieken felül telepíteni kell a gépre egy MySQL ODBC drivert. (ide hiányzik a tábladefiniciós SQL script)