发布者 Brian Wren, Senior Consultant, Microsoft Consulting Services(南加利福尼亚)
介绍如何在 Microsoft Operations Manager (MOM) 2005 中编写脚本的丛书由四部分组成,本文是第一部分。本系列丛书的主旨是比较 MOM 脚本与为 Windows Script Host (WSH) 编写的脚本,以便管理员能够利用大量已汇集到 Windows Script Host 脚本的知识和材料。尽管适当提供了用于支持文档的背景信息和参考资料,但阅读本系列丛书需要您掌握 MOM 2005 的使用知识并具备用 Windows Script Host 编写脚本的基本能力。
此处提供了由四部分组成的系列丛书中的每一篇文章的简要大纲:
|
第一部分 - 基础
|
介绍与 Windows Script Host 中的脚本相比,MOM 脚本所隐含的概念,以及两者使用的共同和不同对象。您将学会如何将脚本输出数据引入 MOM 工作流。
|
|
第二部分 - 将数据引入脚本
|
重点讨论将数据引入 MOM 脚本。这一部分包括使用参数和从启动脚本的 MOM 对象检索信息。
|
|
第三部分 - 编写与调试
|
洞察 MOM 脚本编写与调试的内部事务处理。本文讲述如何使用不同编辑器和实用程序完成上述功能。
|
|
第四部分 - 最佳方法
|
讨论最佳方法,回答常见问题,例如:您应何时用 MOM 脚本生成警报而非事件?在将 MOM 脚本分成多个部分前,它有多复杂?安全性如何?
|
本页内容
所有 MOM 脚本位于何处?
Windows Script Host 与 MOM 脚本
结识 ScriptContext
替换 WScript.Echo
创建事件
创建性能数据
ScriptContext.Echo
任务输出
小结
所有 MOM 脚本位于何处?
只要您使用 MOM,就会发现,它是一个在远程计算机上执行脚本的非常棒的工具。MOM 实际上为你存储脚本,将这些脚本传送到远程计算机,并在本地启动目标计算机上的这些脚本,然后返回结果。您可以按定期计划启动脚本、在响应某些事件时启动脚本或者通过“任务”根据要求启动脚本。这太棒了!经历了最初的兴奋后,您要开始四处寻找示例脚本以插入到 MOM 中。您当然会从唯一、最佳的 Windows 脚本存储库脚本中心开始。
不过请等一下,那里没有一个与 MOM 有关的脚本。尽管其中包含一些很好的示例脚本和实用程序,但却没有一个声明是用于 MOM 的。这是怎么回事?难道他们忘了 MOM?是不是编写 MOM 脚本太困难,以至于我们不得不把它留给专业管理包的作者?为什么脚本中心没有任何 MOM 脚本?
答案实际非常简单:脚本中心的所有(或者至少大多数)脚本都可以是 MOM 脚本。它们是否都与 MOM 相关是另一个问题。举例来说,我不能确定您是否要从 MOM 以自动方式启动用于创建 Active Directory 站点的脚本,不过您完全能够如此!您将自行决定要从 MOM 启动什么脚本。重要的是,脚本中心包含的整个脚本集都可用来在 MOM 中执行。
不过,稍慢!在开始复制和粘贴前,您需要知道,这并不象直接将脚本转储到 MOM,然后通过计划好的事件规则启动该脚本那么简单。不,事实的确如我所言,它们都能在 MOM 中使用。您只需先进行少许修改。这就是本文的要点。
出于对本文的用途的考虑,您应了解如何编写 WSH 脚本。否则,应在处理 MOM 脚本前学习一些基本知识。脚本中心是一个很好的起点,实际上,所有适用于编写 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 不能使用 ScriptContext 对象,该对象仅可用于 MOM 环境(稍后将详细介绍该对象)。
图 2. 可供 MOM 和 WSH 使用的对象。
还要注意的是,尽管不能在 MOM 中使用 WScript 本身,但可以使用从 WScript 创建的对象。在脚本中用 CreateObject 或 GetObject 命令创建的任何对象仍可供使用。这包括 WScript.Shell 和 WScript.Network。这些对象被认为是脚本宿主的逻辑部分,但它们独立于 WScript 对象本身,可以用于任何其他 Windows 脚本编写环境,如 MOM。
这似乎有些混乱,但我们可从中提炼出基本规则:如果在脚本中无需用 CreateObject 或 GetObject 创建对象就能使用对象,则它将只能在单独脚本编写环境中使用。如果是用 CreateObject 或 GetObject 创建的对象,则该对象可供任一使用 Windows 脚本技术的脚本编写环境使用。
因此从技术上说,您对 WSH 脚本要做的唯一更改可能就是删除 WScript 对象的使用。对 - 不能使用脚本中心喜好的所有 WScript.Echo 命令。您也不能通过 WScript.Arguments 接收自变量,当然不能通过 WScript.ScriptName 返回脚本名称。
结识 ScriptContext
由于我们所熟悉的 WScript 不能在 MOM 中实现更多需要的功能,故我们对它的讨论到此为止。我们将结交一个新朋友取而代之:ScriptContext。您可能写不出一个不包含 ScriptContext 的 MOM 脚本,所以理解它提供的信息很重要。
认为 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
|
-
|
返回代表触发脚本执行的 PerfData 的对象。
|
|
IsEvent
|
-
|
如果脚本是为响应事件而执行,则返回 True。
|
|
IsAlert
|
-
|
如果脚本是为响应警报而执行,则返回 True。
|
|
IsPerfData
|
-
|
如果脚本是为响应 PerfData 而执行,则返回 True。
|
|
CreateEvent
|
-
|
创建新的 Event 对象。
|
|
CreateAlert
|
-
|
创建新的 Alert 对象。
|
|
CreatePerfData
|
-
|
创建新的 PerfData 对象。
|
|
Submit
|
-
|
向 MOM 数据流提交对象。
|
|
Echo
|
Echo
|
WScript:向屏幕发送输出。MOM:向调试文件或“任务”事件发送文本输出。
|
|
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 访问参数将在本系列丛书的第二部分讲述。还有 Echo......
替换 WScript.Echo
WScript 对象的最常见的使用是 WScript.Echo,它用于将信息返回到屏幕,而且几乎被脚本中心的所有脚本使用。
在 MOM 中确实有 ScriptContext.Echo,但它的主要用途是调试,而不是从 MOM 脚本获得数据的最常用方式。将在本文的后部分讲述它。先介绍替换 WScript.Echo 语句的最常用的方法。
请记住,MOM 脚本通常是为响应某事件规则而运行,不受任何监视。即使有命令行用来输出数据,也没有人会查看。取而代之,我们需要让脚本创建事件或性能数据块。我们分别讨论这两个选项。
创建事件
MOM 事件用 ScriptContext.CreateEvent 方法创建。您只需设置 Event 对象的几个核心属性,然后提交给 MOM。您未设置的属性将采用默认值。虽然这只需要几行,但比简单的 WScript.Echo 要复杂一些。为方便您的使用,现提供一个创建事件的子例程。如果您不熟悉子例程,可快速浏览 Windows 2000 脚本编写指南(英文)。我们将向子例程传递值,这会有些复杂,但在该指南中有介绍。
使用子例程的原因是,您只需将其粘贴到任何需要创建事件的脚本中,然后为每一事件发布单独命令。即便不知道这个子例程的工作方式,也能有效地使用它。
下面是子例程,很高兴它能对您有所帮助。不过,别以为我有多高深 - 您可以从已装载的管理包的几个 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. 常见的 Event 属性。
|
属性
|
说明
|
|
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 的信息事件“Script Test”源,以及一行消息文本“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
在该脚本中有两行 WScript.Echo。我们应能够使此脚本在 MOM 中运行,方法是将其粘贴到 CreateEvent 子例程中,并用调用 CreateEvent 的语句替换 WScript.Echo 行。此处的解决方法是生成一个事件,指示 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(常规)
|
Name(名称)
|
Remote computer appears to be unavailable(远程计算机似乎不可用)
|
|
Data Provider(数据提供程序)
|
Provider name(提供程序名称)
|
Script-generated data(脚本生成的数据)
|
|
Criteria(条件)
|
From source(来自源)
|
Ping Check(Ping 检查)
|
|
Criteria(条件)
|
With event ID(事件 ID)
|
200
|
|
Alert(警报)
|
Generate alert(生成警报)
|
Checked(已选中)
|
|
Alert(警报)
|
Alert severity(警报严重度)
|
Critical Error(严重错误)
|
对于此处的事件规则,我们可以按照时控规则中的固定时间间隔启动脚本,并确保当 ping 测试失败时收到警报。
创建性能数据
我们已经介绍完事件,接下来创建性能数据。以 CreatePerfData 子例程开始,该例程与前面编写的 CreateEvent 子例程类似。同 CreateEvent 子例程相似,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 中从脚本创建 perf 数据时,可以为这些值定义任意名称。
本示例将使用脚本列出文件属性(英文)。以下是原始脚本:
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,因为这是我们需要的唯一信息。粘贴到子例程中,并将 WScript.Echo 调用改为 CreatePerfData 调用,就可以运行了。(由于示例脚本使用 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 数据的性能规则详细信息
|
选项卡
|
属性
|
值
|
|
General(常规)
|
Name(名称)
|
The size of AppLog.txt has exceeded its threshold value.(AppLog.txt 的大小超出它的阈值。)
|
|
Data Provider(数据提供程序)
|
Provider name(提供程序名称)
|
Script-generated data(脚本生成的数据)
|
|
Criteria(条件)
|
From instance(来自实例)
|
C:\logs\AppLog.txt
|
|
Criteria(条件)
|
Object(对象)
|
File(文件)
|
|
Criteria(条件)
|
Counter(计数器)
|
File Size(文件大小)
|
|
Threshold(阈值)
|
The sampled value(采样值)
|
Checked(已选中)
|
|
Threshold(阈值)
|
Greater than the following value(大于以下值)
|
1000000
|
|
Alert(警报)
|
Generate alert(生成警报)
|
Checked(已选中)
|
|
Alert(警报)
|
Alert severity(警报严重度)
|
Error(错误)
|
ScriptContext.Echo
我先前提到过,ScriptContext.Echo 功能上等同 WScript.Echo,但您不应如此频繁的使用它。创建“事件”和“Perf 数据”实际上是从 MOM 脚本返回数据的更常用的方法。但 ScriptContext.Echo 对于以下两种用途仍很有用:从执行自“任务”的脚本返回信息和调试。调试将在本系列丛书的第三部分讨论,现在讨论“任务”。
任务输出
如果脚本是从“任务”执行的,那么 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. “列出运行进程”脚本中的事件。
小结
我们讨论了需要在 WSH 脚本中修改以备 MOM 使用的内容,以及如何将脚本中的信息引入到 MOM 工作流中。在本系列丛书的第二部分,我们将讨论如何将信息引入脚本。这包括使用参数(它在功能上等同于 WSH 脚本中的自变量)。还将讨论如何访问用于启动脚本的事件、性能数据或警报,这完全是 MOM 独有的概念。
关于作者
Brian Wren 曾经在 Microsoft Consulting Services 担任多年基础结构咨询师,是管理类产品和技术方面的专家。
相关链接