strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}\\" & _
strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * from __InstanceCreationEvent Where " _
& "TargetInstance ISA 'Win32_NTLogEvent' " _
& "and TargetInstance.EventCode = '0' ")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.User
Wscript.Echo objLatestEvent.TargetInstance.TimeWritten
Wscript.Echo objLatestEvent.TargetInstance.Message
Wscript.Echo
Loop
這裡就不詳述 WMI 事件的監視作業了,如果您需要詳細資訊,可以收看我們針對這個主題製作的 Scripting Week 2 網路廣播。這裡只是稍微提一下,我們要建立一個「訂閱」 WMI 事件記錄檔事件的指令碼。每當一個具有特定 EventCode (此處是 0) 的事件,被寫到一個事件記錄檔時,指令碼便會接獲通知,然後回報 User、TimeWritten 和 Message 屬性的值。接著指令碼就回到暫停的動畫,耐心等候下一個事件 0 發生。
對了,我們選擇事件 0,是因為那是 Windows Script Host 事件的事件碼。也就是說,您可以使用像這樣的指令碼,將事件 0 寫到應用程式記錄檔中,測試監視指令碼是否正常運作:
Const EVENT_SUCCESS = 0
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.LogEvent EVENT_SUCCESS, "Event written to an event log using a script."
至於對監視指令碼,我們先連接到 WMI 服務。您可能也注意到在連接 WMI 服務時,我們加了 {(Security)} 參數進來。這是為了讓我們訂閱寫到所有事件記錄檔 (包括安全性記錄檔在內) 的事件。如果沒有這個參數,就會獨漏安全性事件記錄檔所寫的事件。
接著我們再用ExecNotificationQuery 方法來登錄事件記錄檔的事件。查詢本身如下所示:
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * from __InstanceCreationEvent Where " _
& "TargetInstance ISA 'Win32_NTLogEvent' " _
& "and TargetInstance.EventCode = '0' "
我們只想說:請顯示所有 __InstanceCreationEvent 類別的新執行個體,不過這些新的執行個體,都必須剛好是事件記錄檔 (Win32_NTLogEvent) 的新項目,而且新項目的 EventCode 也必須是 0 才行。如果我們要監視其他事件 (比方說,EventCode 為 528 的事件),只要像下例一樣修改查詢就可以了:
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * from __InstanceCreationEvent Where " _
& "TargetInstance ISA 'Win32_NTLogEvent' " _
& "and TargetInstance.EventCode = '528' "
接著再設定一個沒有結束條件的 Do 迴圈 (比方說,不含像 Do Until x = 1 這樣的東西)。這樣就可以永遠監視事件了:指令碼會持續監視,直到我們重新開機,或者終止該指令碼執行的程序為止。(順帶一提,您最好是用 CScript,在命令視窗中執行這個指令碼。如果是用 WScript 執行它,只要一個事件 0 被寫到事件記錄檔,就得按上一大堆訊息方塊)。
接下來我們再利用下面這行程式碼,請指令碼坐在那裡等候下一個事件發生:
Set objLatestEvent = colMonitoredEvents.NextEvent
當新的事件 0 被寫到其中一個事件記錄檔時,指令碼也可以使用一模一樣的事件備份;這個複本物件就是 TargetInstance。這時候我們只要回應 TargetInstance 的一些屬性值,然後循迴執行,等候下一個事件就好了。
換句話說,如果要監視事件記錄檔,看看有沒有特定的事件發生,只要使用事件監視指令碼就行了 (咦!我好像說過了…) |