第一篇 - 基本概念

作者: Brian Wren,Microsoft Consulting Services (南加州) 的資深顧問

本文是有關在 Microsoft Operations Manager (MOM) 2005 中撰寫指令碼之四篇系列中的第一篇。此系列文章的主題在於比較 MOM 中的指令碼與專為 Windows Script Host 撰寫的指令碼,以便充分運用現有的 Windows Script Host 相關指令碼的豐富知識及資料。除了會適切地提供背景資訊與輔助說明文件的參考資料外,此系列也會假設讀者已具備 MOM 2005 的實務知識以及使用 Windows Script Host 編寫指令碼的基本技能。

以下為此四篇系列中每篇文章之簡短總覽:

第 1 篇 - 基本概念

介紹 MOM 指令碼與在 Windows Script Host 中編寫的指令碼相較之下的背後概念,以及個別所使用之物件的異同。您將學會如何將指令碼的輸出資料擷取到 MOM 工作流程。

第 2 篇 - 擷取資料到指令碼中

著重於擷取資料到 MOM 指令碼中。其中包括使用參數,以及從啟動指令碼的 MOM 物件擷取資訊。

第 3 篇 – 撰寫和偵錯

深入探討在 MOM 中撰寫及偵錯指令碼的後勤工作。本文涵蓋使用不同的編輯器與公用程式來執行這些功能。

第 4 篇 – 最佳實例

討論最佳實例以及一般問題的解答,例如:您何時應該使用 MOM 指令碼產生警示而非事件呢?MOM 指令碼應該要多複雜才需要分成多個部分呢?安全性方面呢?


本頁內容

MOM 指令碼都跑到哪裡去了?
Windows Script Host 對 MOM 指令碼
認識 ScriptContext
替換 WScript.Echo
建立事件
建立效能資料
ScriptContext.Echo
工作輸出
結論


MOM 指令碼都跑到哪裡去了?

您正在使用 MOM,而且發現到,別的不提,這是在遠端電腦上執行指令碼一項有力的工具。MOM 事實上會幫您儲存指令碼,將之傳送至遠端電腦,在目標電腦本機上啟動它們,並且回傳結果。您可以定期啟動指令碼來回應某些事件,或是視需要透過工作來執行。這太棒了!一旦您從一開始的興奮中恢復過來,您會開始到處尋找一些指令碼範例,插入到 MOM 中。當然您會從 Windows 指令碼一個最棒的儲存機制,Script Center 開始著手。

但是等一下,那裡沒有任何與 MOM 有關的指令碼。是有些很棒的指令碼範例與公用程式沒錯,但完全沒有說是給 MOM 用的。哪裡有呢?他們難道忘了 MOM 嗎?在 MOM 中編寫指令碼困難到我們得要把它留給專業管理套件作者嗎?為何 Script Center 沒有任何 MOM 指令碼呢?

答案實際上相當直接了當:Script Center 內的所有指令碼都可以是 MOM 指令碼 (反正是大部分都可以)。至於它們在 MOM 中是否全部相關,那是另外一個問題。例如,我懷疑您會對從 MOM 中自動啟動指令碼來建立一個 Active Directory 站台有興趣,不過這是辦得到的!我會讓您自己決定對從 MOM 啟動什麼有興趣。重要的是 Script Center 的整組指令碼都可以運用在 MOM 中執行。

但是等一下!在您開始進行複製與貼上之前,必須要知道這不像是直接丟指令碼到 MOM,然後透過排定好的事件規則來啟動它那麼簡單。不,我沒有騙您,它們全都可以在 MOM 中使用。只是您需要稍微先做一些修改。所以,這就是本文的重點。

基於本文的目的,我將假設您已知道如何在 WSH 中編寫指令碼。如果您不知道,那您應該在處理 MOM 指令碼之前,先從基本開始。Script Center 是很棒的起點,而差不多所有編寫 Windows 指令碼的訓練、說明文件和範例都著重在 Windows Script Host。此系列將告訴您如何修改 WSH 指令碼,以便運用在 MOM 中。

Windows Script Host 對 MOM 指令碼

當您學習如何在 Windows 編寫指令碼時,一定是從 Windows Script Host 下手。這很合理,因為 WSH 極富彈性,允許您使用各種不同的實用技術,像是 Active Directory Service Interfaces (ADSI) 與 Windows Management Instrumentation (WMI) 等,在命令列上執行指令碼。不過這可能會讓我們開始認為 WSH 與編寫指令碼是同義詞,而且是市面上唯一的指令碼環境。

WSH 與 MOM 指令碼之間到底是什麼樣的關係?MOM 會呼叫 WSH 來幫它執行指令碼嗎?MOM 會為了執行類似的功能而複製整個 WSH 環境嗎?這兩者之間的指令碼有多麼相同呢?我們可以使用相同的語言嗎?我們會認為可以使用 VBScript 及 JScript,但是其他像是 PerlScript 這樣的語言呢? 接著最後的問題是,我需要變更 WSH 指令碼以便於 MOM 中使用嗎?如果是,我需要做哪些變更呢?好了,問題夠多了 - 讓我們來看看是否能提供一些解答。

WSH 是建置於模組化的結構上,此結構會運用內含在 Windows 的指令碼元件。由於有許多的元件參與執行指令碼,「Windows Script Host」這個名詞到底指的是什麼可能很讓人困惑。所有這些元件有時候會落在 WSH 的範疇內。費盡心力指認出每個元件並無用處,不過我們會改在本文中參考一些真正的執行檔 - wscript.exe 及 cscript.exe - 就跟 WSH 一樣。其餘的元件則是由其他指令碼碼環境所共用。這會在 [圖 1] 中說明 (有點過度簡化)。

指令碼環境

[圖 1] 指令碼環境。

WSH 及 MOM 皆為指令碼環境。兩者在 Windows 中皆使用相同的指令碼服務。兩者皆可執行 VBScript、JScript,或是任何其他您在執行指令碼的電腦上載入的指令碼語言。WSH 與 MOM 運作如此相似並非巧合 - 它們使用相同的物件,而這些物件會處理大部分的工作。因此,它們可以在不需要修改的情況下執行幾乎一模一樣的指令碼。幾乎一模一樣。

您有沒有覺得很奇怪為什麼在使用 WScript 物件之前不用先建立它?在您使用指令碼中的物件之前,必須先使用 CreateObject 或是 GetObject 來建立它,但是 WScript 的好像就已經存在了。請參考以下簡單的指令碼:


WScript.Echo "Hello world."


雖然此指令碼沒什麼用處,但是如果您在 Windows Script Host 中啟動它,還是可以如常運作。雖然找不到任何 CreateObject,不過我們還是能夠使用 WScript 物件。這是因為 WSH 會自動提供 WScript 物件給我們來代表指令碼裝載本身,並且提供 WSH 指令碼特定的一些核心功能。其他的指令碼環境並不能存取 WScript 物件,但是它們或許可以提供一些類似的東西。

請仔細看一下 [圖 2]。此圖說明 MOM 與 WSH 指令碼兩者都可以存取許許多多的一般物件 (請注意此圖的物件清單並未包含所有物件。它只是用來指出一些較常用到的可編寫指令碼的物件。)這些包括 ADSI、WMI,以及任何其他您習慣使用的可編寫指令碼的物件。不同之處在於 MOM 指令碼不能使用 WScript 物件。同樣地,WSH 不能使用只能在 MOM 環境中提供的 ScriptContext 物件 (稍後會探討)。

MOM 與 WSH 中的物件

[圖 2] 可用於 MOM 及 WSH 的物件。

不過有件事要注意的是,雖然您無法在 MOM 中使用 WScript 本身時,但是您可以使用從 WScript 所建立的物件。任何您使用 CreateObject 或是 GetObject 命令在指令碼中建立的物件都還是可以如常運作。這包括 WScript.Shell 及 WScript.Network。這些物件被視為指令碼裝載的邏輯部分,但是它們與 WScript 物件本身不同,而且可以用在任何其他 Windows 指令碼環境,如 MOM。

這或許有點令人困惑,但是讓我們回歸到基本原則:如果一個物件可以在不需使用 CreateObject 或是 GetObject 先建立的情況下用於指令碼中,那麼它就只能用於單一的指令碼環境。如果物件是以 CreateObject 或 GetObject 建立,那它就可以用於任何運用 Windows 指令碼技術的指令碼環境。

所以就技術上而言,您唯一需要對任何 WSH 指令碼所做的變更可能是移除任何 WScript 物件的使用。沒錯,Script Center 所熱愛的所有 WScript.Echo 命令全都不能用。您也沒辦法使用 WScript.Arguments 接收引數,而且肯定無法使用 WScript.ScriptName 傳回指令碼名稱。

認識 ScriptContext

我們不能做的事也說夠了。我們的老朋友 WScript 無法幫我們在 MOM 做任何事,所以就隨它去吧!我們即將認識新朋友來取代它的位置:ScriptContext。您所寫的每個 MOM 指令碼幾乎都會包含 ScriptContext,所以了解它提供什麼功能是很重要的。

或許將 ScriptContext 視作為 WScript 的功能對等會比較容易了解,而且它有些共同的方法可能有助您您感覺新鮮又模糊。它具有對等於 WScript 的主要功能 - 本身提供存取 MOM 指令碼環境,並且提供 MOM 特有的功能。不同於由盯著螢幕的互動式使用者所執行,MOM 指令碼通常是由在某處的遠端電腦 (有可能是一次由多部電腦同時) 的某些自動方式 (在已排程的基礎下、回應某事件等等) 所執行的。 MOM 指令碼無法直接將其輸出送回螢幕上,而必須以某種方式透過 MOM 工作流程引擎回報。ScriptContext 提供了方法讓我們這麼做。

[表 1] 提供一些較常用的 ScriptContext 與 WScript 方法與屬性的比較。這並不是完整的清單,但是您可以在 MOM 2005 SDK 中找到關於 ScriptContext 的完整說明文件。我選擇此清單主要是為了說明這兩個物件之間的異同。

[表 1] ScriptContext 與 WScript 方法及屬性之比較

ScriptContext

WScript

說明

Event

-

傳回代表觸發指令碼執行之 Event 的物件。

Alert

-

傳回代表觸發指令碼執行之 Alert 的物件。

PerfData

-

傳回代表觸發指令碼執行之 PerData 的物件。

IsEvent

-

如果指令碼是為回應事件而執行,則會傳回 True。

IsAlert

-

如果指令碼是為回應警示而執行,則會傳回 True。

IsPerfData

-

如果指令碼是為回應 PerfData 而執行,則會傳回 True。

CreateEvent

-

建立新的 Event 物件。

CreateAlert

-

建立新的 Alert 物件。

CreatePerfData

-

建立新的 PerfData 物件。

Submit

-

提交物件至 MOM 資料串流。

Echo

Echo

WScript:將輸出傳至 screenMOM:將文字輸出傳到偵錯檔案或是到 Task 事件。

Name

ScriptName

傳回目前正在執行指令碼的名稱。

Parameters

Arguments

提供對指令碼引數 (WScript) 或是參數 (MOM) 的存取。

Quit

Quit

立即停止執行指令碼。

Sleep

Sleep

依據指定的秒數暫停指令碼執行。

-

FullName

傳回主機執行檔的路徑。

-

Name

傳回 WScript 物件的名稱。

-

ScriptFullName

傳回目前執行中指令碼的完整路徑。

-

StdIn

公開目前指令碼的輸入資料流。

-

StdOut

公開目前指令碼的輸出資料流。

-

StdErr

公開目前指令碼的錯誤輸出資料流。

-

Version

傳回 Windows Script Host 的版本。


此表的重點在於每個物件特有的屬性和方法與那些直接對等物件的比較。請注意在 ScriptContext 中沒有直接對等的 WScript 屬性,反正在 MOM 中也沒有關聯,而且任何對它們的參考也都可以移除。Sleep 與 Quit 是直接對等的,而且您可以直接將兩者互換。使用 ScriptContext.Parameters 來存取參數會在此系列的第 2 篇中探討。那就只剩下 Echo,

替換 WScript.Echo

最常用的 WScript 物件是 WScript.Echo,它是用於將訊息回傳至螢幕,而且 Script Center 中幾乎所有指令碼都會用到它。

沒錯,我們在 MOM 中是有 ScriptContext.Echo,但是它主要是用於偵錯,而且並不是從 MOM 指令碼中取回資料最常用的方式。我要先保留一下,在本文稍後再說明 ScriptContext.Echo。首先,我想要討論替換這些 WScript.Echo 陳述式最常用的方式。

請記住 MOM 指令碼通常是在沒有人監視的情況下,為回應一些事件規則而執行的。即使是有命令列可傳送輸出,也沒有人會監看它。相反地,我們需要讓我們的指令碼建立一個事件或者是效能資料片段。讓我們分開來討論每個選項。

建立事件

MOM 事件是用 ScriptContext.CreateEvent 方法建立的。您只需要在 Event 物件上設定幾個核心屬性,然後將之提交給 MOM 就可以了。任何您沒有設定的屬性都會使用預設值。雖然這只需要幾行字,但是它比簡單的 WScript.Echol 還要複雜一點。為了減輕您的負擔,我會給您一個副程式來建立事件。如果您不熟悉副程式,可以在《Windows 2000 Scripting Guide》(英文) 中惡補一下。我們將傳遞一些值到副程式中,這會使它稍微複雜一點,不過這在指南中也有記載。

我使用副程式的原因,是要讓您能夠直接把它貼上到任何需要建立事件的指令碼中,然後為每個事件發出單一命令。您甚至不需要知道副程式的運作方式就可以有效地運用。

就是如此,很高興能為您效勞。可別認為我學識淵博 - 您可以從可能早就裝載的管理套件中的幾個 MOM 指令碼中找到類似的程式。


Sub CreateEvent(intEventNumber,intEventType,strEventSource,strEventMessage)
    Set objEvent = ScriptContext.CreateEvent()
    objEvent.EventNumber = intEventNumber
    objEvent.EventType = intEventType 
    objEvent.EventSource = strEventSource
    objEvent.Message = strEventMessage
    ScriptContext.Submit objEvent
End Sub


副程式的第一行會建立新的 Event 物件,並將之指派給物件變數。我們接著指派值給 Event 物件的不同屬性,最後再用 ScriptContext.Submit 將之提交給 MOM 工作流程。

Event 物件還有其他您可能想要設定的屬性,不過我已涵蓋最常用的。這些對您編寫大部分的指令碼應該綽綽有餘。我讓您自行參閱 MOM SDK 來認識其他屬性。只要在 ScriptContext.Submit 命令之前設定它們的值就可以了。[表 2] 說明副程式中使用的每個屬性。

[表 2] 常見事件屬性。

屬性

說明

EventNumber

指派給事件的任意數。主要用於事件規則中的準則。

EventType

事件類型的整數值。必須是下列的值之一:
0 - 成功
1 - 錯誤
2 - 警告
4 - 資訊
8 - 稽核成功
16 - 稽核失敗

EventSource

事件的來源。通常與相似的事件一致。用於事件規則上的準則,並且用來分組常用事件。

Message

詳細的訊息會出現在事件說明欄位中。


若要呼叫 CreateEvent 富程式,請在您的指令碼中使用以下的語法 - 這將會成為取代 WScript.Echo 的那一行。


CreateEvent <EventNumber>,<EventType>,<EventSource>,<Message>


讓我們從簡單的範例開始,並且變更我們的「Hello World」指令碼來傳送事件。指令碼本身並沒有用,但是它確實為我們說明了一個概念。除了副程式之外,我還為不同的事件類型值增加了常數。也歡迎您複製作為己用。


Const EVENT_TYPE_SUCCESS = 0
Const EVENT_TYPE_ERROR   = 1
Const EVENT_TYPE_WARNING = 2
Const EVENT_TYPE_INFORMATION = 4
Const EVENT_TYPE_AUDITSUCCESS = 8
Const EVENT_TYPE_AUDITFAILURE = 16

CreateEvent 100,EVENT_TYPE_INFORMATION,"Script Test","Hello world."

Sub CreateEvent(intEventNumber,intEventType,strEventSource,strEventMessage)
    Set objEvent = ScriptContext.CreateEvent()
    objEvent.EventSource = strEventSource
    objEvent.EventNumber = intEventNumber
    objEvent.EventType = intEventType 
    objEvent.Message = strEventMessage
    ScriptContext.Submit objEvent
End Sub


喲!我們剛將單行指令碼擴張為 15 行的程式碼。不過請記住雖然常數定義與 CreateEvent 副程式可直接複製到指令碼中。我們依然只會編寫一行有效的程式碼。事實上那還不賴。

此指令碼的功能在於發行一個事件數字為 100 的 Information 事件,一個「指令碼測試」的來源,以及在訊息中的單行文字 -「Hello World」。

現在有了副程式之後,讓我們在真正的指令碼中試用它,做些有用的事。我們將會從以下的指令碼,確認電腦可用性開始,此指示碼使用 WMI 對網路裝置上執行 Ping 來確認它的可用性。此指令碼可用來驗證電腦或是其他不受 MOM 監控的裝置的存在 - 像是電腦或重要路由器的預設閘道。


strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colPingedComputers = objWMIService.ExecQuery _
    ("Select * from Win32_PingStatus Where Address = '192.168.1.37'")

For Each objComputer in colPingedComputers
    If objComputer.StatusCode = 0 Then
        Wscript.Echo "Remote computer responded."
    Else
        Wscript.Echo "Remote computer did not respond."
   End If
Next


審視此指令碼,我們看到 2 行 WScript.Echo。藉由將它貼到我們的 CreateEvent 副程式,並且將 WScript.Echo 各行替換成對 CreateEvent 的呼叫,應該可以使此指令碼在 MOM 中運作。此處的解決方案是要產生一個指出 Ping 成功與否的事件。我們會設有事件規則來擷取這些事件,並且可能產生警示。為了使這些事件能清楚地分辨出成功與失敗的事件,我們應該為每種類型指派唯一的事件號碼。

新指令碼顯示如下:


Const EVENT_TYPE_SUCCESS = 0
Const EVENT_TYPE_ERROR   = 1
Const EVENT_TYPE_WARNING = 2
Const EVENT_TYPE_INFORMATION = 4
Const EVENT_TYPE_AUDITSUCCESS = 8
Const EVENT_TYPE_AUDITFAILURE = 16

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colPingedComputers = objWMIService.ExecQuery _
    ("Select * from Win32_PingStatus Where Address = '192.168.1.37'")

For Each objComputer in colPingedComputers
    If objComputer.StatusCode = 0 Then
        CreateEvent 100,EVENT_TYPE_SUCCESS,"Ping Check","Remote computer responded."
    Else
        CreateEvent 200,EVENT_TYPE_ERROR,"Ping Check","Remote computer did not respond."
   End If
Next

Sub CreateEvent(intEventNumber,intEventType,strEventSource,strEventMessage)
    Set objEvent = ScriptContext.CreateEvent()
    objEvent.EventSource = strEventSource
    objEvent.EventNumber = intEventNumber
    objEvent.EventType = intEventType 
    objEvent.Message = strEventMessage
    ScriptContext.Submit objEvent
End Sub


您將會注意到我們在 CreateEvent 陳述式中有事件碼 100 及 200。對於此指令碼,我隨意地決定使用 100 代表成功的事件,而 200 代表錯誤事件。如果指令碼變得更複雜,我或許會使用 201、202 等等來代表其他的錯誤事件。這允許我們建立使用事件號碼作為準則的事件規則 - 與 MOM 中大部分的事件準則運作方式相似。我同時也在事件來源中隨意地使用「Ping Check」- 如此一來這就可以包含到事件規則的準則中。在 MOM 中事件規則最常用的準則是事件來源與號碼,所以即使您可以隨意指定這些值,還是應該小心地選擇。

[圖 3] 顯示由我們修改過的指令碼所產生的事件範例。

產生的事件

[圖 3] 指令碼產生的事件範例。

說到事件規則,讓我們從修改過的指令碼可能建立的事件中,建立一個事件規則來產生警示以完成此範例。我們可能不會建立事件規則從此指令碼中擷取成功事件,因為我們通常只對從錯誤中產生警示有興趣。

任何由指令碼產生的 MOM 事件都會指派一個「指令碼產生的資料」提供者,而這就是事件規則應該使用的提供者。[表 3] 指出會從 [圖 3] 的錯誤事件中產生警示的事件規則屬性。

[表 3] 擷取範例事件之事件規則詳細資料

索引標籤

屬性

一般 (General)

名稱

遠端電腦似乎無法使用

資料提供者 (Data Provider)

提供者名稱

指令碼產生的資料

準則 (Criteria)

從來源

Ping Check

準則 (Criteria)

含事件 ID

200

警示 (Alert)

產生警示

已核取

警示 (Alert)

警示嚴重性

嚴重錯誤


設有這樣的事件規則,我們可以從一個計時規則在固定的間隔啟動指令碼,並且確定會在我們的 Ping 測試失敗時,收到警示。

建立效能資料

現在我們已經探討完事件,讓我們來建立一些效能資料。我們先從與前一節所編寫的 CreateEvent 副程式類似的 CreatePerfData 副程式開始。與 CreatedEvent 副程式一樣,CreatePerfData 可以直接貼到任何需要它的指令碼上,然後透過單行程式碼加以呼叫。


Sub CreatePerfData(strObjectName,strCounterName,strInstanceName,numValue)
    Set objPerfData = ScriptContext.CreatePerfData
    objPerfData.ObjectName = strObjectName
    objPerfData.CounterName =strCounterName
    objPerfData.InstanceName = strInstanceName
    objPerfData.Value = numValue
    ScriptContext.Submit objPerfData
End Sub


此副程式會建立新的效能資料片段,設定物件不同的屬性,然後將之提交至 MOM 工作流程。這些屬性自我闡明度很高,但是為以防萬一,還是在 [表 4] 中加以定義。

[表 4] 效能資料屬性

屬性

說明

ObjectName

效能物件的名稱

CounterName

效能計數器的名稱

InstanceName

效能執行個體的名稱

Value

資料的數值


如要呼叫副程式,請使用以下語法:


CreatePerfData <ObjectName>,<CounterName>,<InstanceName>,<Value>


在 MOM 中的每一效能資料片段都會依物件名稱、計數器名稱和執行個體名稱加以識別 - 就如同從 Windows 的標準計數器收集的效能資料一樣。當您在 MOM 中建立「Windows NT 效能計數器」提供者時,會受限於使用實際安裝到伺服器上的計數器。當您從 MOM 指令碼中建立效能資料時,可以為這些值定義任何您想要的名稱。

我將使用指令碼列出檔案屬性作為我們此次的範例。原始指令碼顯示如下:


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll")

Wscript.Echo "Date created: " & objFile.DateCreated
Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed
Wscript.Echo "Date last modified: " & objFile.DateLastModified
Wscript.Echo "Drive: " & objFile.Drive
Wscript.Echo "Name: " & objFile.Name
Wscript.Echo "Parent folder: " & objFile.ParentFolder
Wscript.Echo "Path: " & objFile.Path
Wscript.Echo "Short name: " & objFile.ShortName
Wscript.Echo "Short path: " & objFile.ShortPath
Wscript.Echo "Size: " & objFile.Size
Wscript.Echo "Type: " & objFile.Type


此指令碼會傳回指定檔案的所有屬性,而我們很顯然地需要擺脫掉所有那些 WScript.Echo 行。讓我們假設我們有興趣追蹤某一特定檔案大小來作為效能資料。這可能是一個持續成長的紀錄檔,而除了追蹤它的大小來呈報之外,我們也想要在它達到特定大小時產生警示。我們可以把指令碼中所參考的屬性數目減少為只剩 Size,因為那是我們將會需要的唯一資訊片段。貼到我們的副程式,然後變更對 CreatePerfData 呼叫的 WScript.Echo 呼叫,這樣就大公告成了 (我同時還變更我們正在追蹤大小的檔案,因為範例指令碼使用的是有固定大小的 scrrun.dll)。


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("c:\logs\AppLog.txt")

CreatePerfData "File","File Size",objFile.Path,objFile.Size

Sub CreatePerfData(strObjectName,strCounterName,strInstanceName,numValue)
    Set objPerfData = ScriptContext.CreatePerfData
    objPerfData.ObjectName = strObjectName
    objPerfData.CounterName =strCounterName
    objPerfData.InstanceName = strInstanceName
    objPerfData.Value = numValue
    ScriptContext.Submit objPerfData
End Sub


如果我們單純只是要追蹤檔案的大小,就不需要做其他的動作。此指令碼一執行,效能計數器馬上就會出現在 MOM 中。什麼效能收集規則都不需要。[圖 4] 顯示了由指令碼所建立之計數器的 Operator Console 螢幕擷取畫面。

效能資料範例

[圖 4] 效能資料範例。

如果我們想要為此計數器設定臨界值規則,並且在它超過特定值時發出警示,那麼我們會需要與 [表 5] 內容相似的臨界值規則。

[表 5] 範例 Perf Data 之效能規則詳細資料

索引標籤

屬性

一般 (General)

名稱

AppLog.txt 的大小已經超過它的臨界值。

資料提供者 (Data Provider)

提供者名稱

指令碼產生的資料

準則 (Criteria)

從執行個體

C:\logs\AppLog.txt

準則 (Criteria)

物件

檔案

準則 (Criteria)

計數器

檔案大小

臨界值 (Threshold)

取樣值

已核取

臨界值 (Threshold)

比以下的值還大

1000000

警示 (Alert)

產生警示

已核取

警示 (Alert)

警示嚴重性

錯誤


ScriptContext.Echo

稍早我提過 ScriptContext.Echo 與 WScript.Echo 功能對等,但是您不會像使用 WScript.Echo 一樣經常用到它。建立 Events 與 Perf Data 事實上是從 MOM 指令碼中取回資料比較常用的方法。ScriptContext.Echo 還是在用於下列兩個目的時還是很實用:從工作中所執行的指令碼傳回資訊,以及偵錯。偵錯會在本系列中的第 3 篇中討論,但是我會在此先討論工作。

工作輸出

如果指令碼是從工作執行,那麼 ScriptContext.Echo 的任何輸出都會出現在指出工作完成的 MOM 事件中。這可用來測試您在 MOM 其他地方要使用的指令碼,或者也可以是一項有用工作的基礎。請看看指令碼列出處理緒擁有者,它會列出電腦上目前執行的所有處理序,以及這些處理序的擁有者。


strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process")

For Each objProcess in colProcessList
    colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
    Wscript.Echo "Process " & objProcess.Name & " is owned by " _ 
        & strUserDomain & "\" & strNameOfUser & "."
Next


透過工作啟動此指令碼來取決遠端伺服器 (或是多部遠端伺服器) 上目前正在執行的處理序可說是相當有用。這也可用在疑難排解的情況下。我們可以單純將 WScript.Echo 變更為 ScriptContext.Echo 來修改此指令碼,以執行完全一樣的功能。


strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process")

For Each objProcess in colProcessList
    colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
    ScriptContext.Echo "Process " & objProcess.Name & " is owned by " _ 
        & strUserDomain & "\" & strNameOfUser & "."
Next


若要測試此指令碼,請建立一個工作來執行它,並且對著代理電腦啟動工作。在幾秒鐘的時間之內,您應該會收到一個類似於 [圖 5] 的事件。

事件

[圖 5] 「列出執行中處理序」指令碼的事件。

結論

我們討論了您要為 MOM 做好準備而在 WSH 指令碼中所需進行的修改,以及您如何從指令碼中取得資訊放入到 MOM 工作流程中。在本系列的第 2 篇,我們將探討如何擷取資訊到指令碼中。這包括使用參數,其功能就相等於 WSH 指令碼中的引數。我們也將討論如何存取啟動指令碼的事件、效能資料或警示,這是完全專屬於 MOM 的概念。

作者簡介

Brian Wren 身為 Microsoft Consulting Services 的基礎結構顧問多年,他專長於管理產品與技術。

相关链接

顯示: