
Cikkünkhöz mellékeltük az alábbiakban tárgyalásra kerülő szkriptet "CheckRegEvents.vbs" néven. Futtatásával ellenőrzésünk alá vonjuk a "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\\Windows NT\\CurrentVersion" registry kulcs változásait.
Az operációs rendszer figyelemmel kísérti a regisztrációs adatbázis minden módosulását és a felhasználói felület felé - a programok, szkriptek számára - biztosít néhány függvényt a könnyebb kezelhetőség érdekében. Alapvetően az események három típusát különböztetjük meg:
A registry szerkezetének hierarchiájában történő változásokat kíséri figyelemmel.
Egy megadott kulcs változásait figyeli.
Egy megadott bejegyzés változásait figyeli.
Alábbi példánkban a középső osztály használatát ismertetjük, lényegét tekintve a másik kettő is így működik:
Kapcsolatot teremtünk a WMI szolgáltatással a "winmgmts" interfészen keresztül. Ez hivatott a rendszerszintű osztályok és a felhasználói programok közötti átmentet biztosítani. A regisztrációs adatbázist kezelő osztályok és függvények a WMI root/default névterében találhatók.
Set wmiServices = GetObject("winmgmts:root/default")
A változtatások ellenőrzését aszinkron eseményfigyeléssel lehet végrehajtani. Azért nevezzük aszinkronnak, mert a szkriptben nem kell ismétlődő ciklusokkal figyeltetni, hanem csak egyszer fut le az ellenőrző rész és az esemény bekövetkeztekor jelzés érkezik a szkripthez is. Másként fogalmazva az esemény és a szkript adott részének futása nem kell, hogy szinkronban legyen a sikeres végrehajtáshoz. Ezt hivatott szolgálni a "WbemScripting.SWbemSink" objektum.
Set wmiSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
Lekérünk minden eseményt a "RegistryKeyChangeEvent" objektumtól, ami a "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\\Windows NT\\CurrentVersion" kulccsal kapcsolatos.
wmiServices.ExecNotificationQueryAsync wmiSink, "SELECT * FROM RegistryKeyChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' AND " & "KeyPath='SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'"
Megjelenítünk egy üzenetablakot ("vbCrLf" egy sortörés a szövegkiírásban).
WScript.Echo "Kilépés a regisztrációs adatbázis figyeléséből." & vbCrLf
Ha a felhasználó rákattint az ablakban lévő "OK" gombra kilépünk és lezárjuk a szkript futtatását.
Mi történik, ha bekövetkezik az esemény? Elindul az alábbi eljárás:
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
Ahol kiíratjuk az eseménnyel kapcsolatos információkat.
WScript.Echo "Érzékelt esemény:" & vbCrLf & _
"------------------------------" & vbCrLf & _
wmiObject.GetObjectText_()
End Sub