嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的《嗨,Scripting Guy!過往文件》。

今天的問題:如何監視事件記錄檔,看看有沒有特定事件發生?


如何監視事件記錄檔,看看有沒有特定事件發生?

嗨,Scripting Guy! 我要如何監視事件記錄檔,看看有沒有特定事件發生呢?

-- JP

JP,您好。當然是用事件記錄檔監視指令碼嘍。(沒錯,不可思議吧,不過我們可是花了好大一把勁,才能答得這麼漂亮)。

說得更清楚一點吧:下面就是您要用的事件記錄檔監視指令碼:

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) 的事件,被寫到一個事件記錄檔時,指令碼便會接獲通知,然後回報 UserTimeWrittenMessage 屬性的值。接著指令碼就回到暫停的動畫,耐心等候下一個事件 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 的一些屬性值,然後循迴執行,等候下一個事件就好了。

換句話說,如果要監視事件記錄檔,看看有沒有特定的事件發生,只要使用事件監視指令碼就行了 (咦!我好像說過了…)


如需詳細資訊

請參閱嗨,Scripting Guy! - 過往文件

 

回到頁首 回到頁首