代理程式版本監視類型

Microsoft.SystemCenter.Agent.Configuration.MinRequiredVersionCheckMonitorType (UnitMonitorType)

此監視類型會檢查代理程式版本,並在代理程式版本低於提供的最低版本時產生警示。

Element properties:

RunAsDefault
AccessibilityInternal
Support Monitor RecalculateTrue

Member Modules:

ID Module Type TypeId RunAs 
SchedulerDS DataSource System.Scheduler Default
PassThrough ProbeAction System.PassThroughProbe Default
ScriptProbe ProbeAction Microsoft.Windows.ScriptPropertyBagProbe Default
FilterUpgradeNotRequired ConditionDetection System.ExpressionFilter Default
FilterUpgradeRequired ConditionDetection System.ExpressionFilter Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
RequiredVersionstring$Config/RequiredVersion$所需代理程式版本
IntervalSecondsint$Config/IntervalSeconds$頻率 (秒)
TimeoutSecondsint$Config/TimeoutSeconds$逾時 (秒)

Source Code:

<UnitMonitorType ID="Microsoft.SystemCenter.Agent.Configuration.MinRequiredVersionCheckMonitorType" Accessibility="Internal">
<MonitorTypeStates>
<MonitorTypeState ID="UpgradeNotRequired" NoDetection="false"/>
<MonitorTypeState ID="UpgradeRequired" NoDetection="false"/>
</MonitorTypeStates>
<Configuration>
<xsd:element minOccurs="1" maxOccurs="1" name="RequiredVersion" type="xsd:string"/>
<xsd:element minOccurs="1" maxOccurs="1" name="ComputerName" type="xsd:string"/>
<xsd:element minOccurs="1" maxOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element minOccurs="1" maxOccurs="1" name="TimeoutSeconds" type="xsd:int"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="RequiredVersion" Selector="$Config/RequiredVersion$" ParameterType="string"/>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<MonitorImplementation>
<MemberModules>
<DataSource ID="SchedulerDS" TypeID="System!System.Scheduler">
<Scheduler>
<SimpleReccuringSchedule>
<Interval>$Config/IntervalSeconds$</Interval>
</SimpleReccuringSchedule>
<ExcludeDates/>
</Scheduler>
</DataSource>
<ProbeAction ID="ScriptProbe" TypeID="Windows!Microsoft.Windows.ScriptPropertyBagProbe">
<ScriptName>AgentMinRequiredVersionCheck.vbs</ScriptName>
<Arguments>$Config/ComputerName$ $Config/RequiredVersion$</Arguments>
<ScriptBody><Script>
'Copyright (c) Microsoft Corporation. All rights reserved.
'*************************************************************************
' ScriptName: Microsoft.SystemCenter.2007.AgentMinRequiredVersionCheck
'
' Purpose - Compare the Agent Version with the Required Version
'
' Parameters - 0 - Computer Name
' 1 - Required Version
'
'*************************************************************************

Option Explicit

' Entry Point
Call Main


' CompleteVersionString
' ---------------------
'
' Appends ".0" to the end of the version
'
' Parameters
' versionString: String to append the zero
' length: number of parts that are to be appended
'
' Return
' String with appended version parts set to 0
'
Sub CompleteVersionString(ByRef versionString, ByVal length)
Dim i
For i = 0 to length - 1
versionString = versionString &amp; ".0"
Next
End Sub


' Main
' ---------------------
'
' Main subroutine of the script
'
Sub Main

SetLocale("en-us")
InitializeCommon(3000)

' check arguments
Dim oArgs
Set oArgs = WScript.Arguments
If oArgs.Count &lt; 2 Then
ThrowScriptError "Invalid parameters passed to " &amp; GetScriptName &amp; ".", Null
End If

' process arguments:
' 0 - computerName
' 1 - requiredVersion
Dim computerName, requiredVersion
computerName = oArgs(0)
requiredVersion = oArgs(1)

' create MOM Script API object
Dim oAPI, oDiscoveryData, oInstance
Set oAPI = MOMCreateObject("MOM.ScriptAPI")

' create Registry object
Dim oReg, key, value, agentVersion
' suppress error
On Error Resume Next
Set oReg = MOMCreateObject("WScript.Shell")
key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Operations Manager\3.0\Setup\"
value = "AgentVersion"
agentVersion = oReg.RegRead(key &amp; value)
If Err.Number &lt;&gt; 0 Then
' registry does not exist. Possible cause is a 32-bit agent installed on 64-bit OS
Err.Clear
key = "HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\Microsoft\Microsoft Operations Manager\3.0\Setup\"
agentVersion = oReg.RegRead(key &amp; value)

If Err.Number &lt;&gt; 0 Then
' registry does not exist. Possible cause is a Management Server
Err.Clear
key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Operations Manager\3.0\Setup\"
value = "ServerVersion"
agentVersion = oReg.RegRead(key &amp; value)

If Err.Number &lt;&gt; 0 Then
ThrowScriptError "An error occurred while reading the registry: '" &amp; key &amp; value &amp; "'", Err
End If
End If
End If
' resume error
On Error Goto 0

' get Agent version
If IsNull(agentVersion) = False And agentVersion &lt;&gt; "" Then
' create property bag
Dim oPropertyBag
Set oPropertyBag = oAPI.CreatePropertyBag()
If IsObjectUnallocated(oPropertyBag) = False Then
Dim agentVersionParts, requiredVersionParts, agentVersionLength, requiredVersionLength
agentVersionParts = Split(agentVersion, ".")
requiredVersionParts = Split(requiredVersion, ".")
agentVersionLength = GetArrayLength(agentVersionParts)
requiredVersionLength = GetArrayLength(requiredVersionParts)

' set the lengths of both equal by appending .0 at the end
If requiredVersionLength &lt; agentVersionLength Then
Call CompleteVersionString(requiredVersion, agentVersionLength - requiredVersionLength)
requiredVersionParts = Split(requiredVersion, ".")
ElseIf requiredVersionLength &gt; agentVersionLength Then
Call CompleteVersionString(agentVersion, requiredVersionLength - agentVersionLength)
agentVersionParts = Split(agentVersion, ".")
End If
agentVersionLength = GetArrayLength(agentVersionParts)

Dim requiresUpgrade
requiresUpgrade = "false"

' compare the respective parts
Dim i, agentPart, requiredPart
For i = 0 to agentVersionLength
' suppress error
On Error Resume Next

' check Agent version part
agentPart = Int(agentVersionParts(i))
If Err.Number &lt;&gt; 0 Then
agentPart = 0
Err.Clear
End If

' check required version part
requiredPart = Int(requiredVersionParts(i))
If Err.Number &lt;&gt; 0 Then
requiredPart = 0
Err.Clear
End If

' resume error
On Error Goto 0

If agentPart &lt; requiredPart Then
' Agent Version is lower, so requires an upgrade
requiresUpgrade = "true"
Exit For
ElseIf agentPart &gt; requiredPart Then
' Agent Version is higher, so does not require an upgrade
Exit For
End If
Next

' exit with property bag
Call oPropertyBag.AddValue("UpgradeRequired", requiresUpgrade)
Call oPropertyBag.AddValue("CurrentVersion", agentVersion)
Call oPropertyBag.AddValue("RequiredVersion", requiredVersion)
Call oAPI.Return(oPropertyBag)
WScript.Quit
Else
ThrowScriptError "Unable to create propertybag in script.", Null
End If
Else
ThrowScriptError "Agent Version not found in Registry.", Null
End If

End Sub
'Copyright (c) Microsoft Corporation. All rights reserved.

' Constants
Const SCOM_SUCCESS = 0
Const SCOM_ERROR = 1
Const SCOM_WARNING = 2
Const SCOM_INFORMATION = 4

Const HKEY_LOCAL_MACHINE = &amp;H80000002

Dim SCRIPT_EVENT_ID

' Library Initializer
Sub InitializeCommon(iScriptEventID)
'set the script event id
SCRIPT_EVENT_ID = iScriptEventID
End Sub


' Check the list for null or empty
Function IsListEmpty(ByVal oList)
IsListEmpty = (IsNull(oList) = True) OR (oList.Count &lt; 1)
End Function


' Check object for null, empty or nothing
Function IsObjectUnallocated(ByVal obj)
IsObjectUnallocated = IsNull(obj) OR IsEmpty(obj) OR (TypeName(obj) = "Nothing")
End Function


' Gets the length of an array
Function GetArrayLength(ByRef array)
GetArrayLength = UBound(array) + 1
End Function


' Get the Host Computer name
Function GetHostComputerName
Dim oNetwork
Set oNetwork = MOMCreateObject("WScript.Network")
GetHostComputerName = oNetwork.ComputerName
End Function


' Get the WMI object
Function GetWMIObject(ByVal namespace)
Dim oWMI

'get the object
On Error Resume Next
Set oWMI = GetObject(namespace)
If Err.Number &lt;&gt; 0 Or IsEmpty(oWMI) Then
ThrowScriptError "Unable to open WMI Namespace '" &amp; namespace &amp; "'. Check to see if the WMI service is enabled and running, and ensure this WMI namespace exists.", Err
End If
On Error Goto 0

Set GetWMIObject = oWMI
End Function


' Get Registry object
Function GetRegistryObject(ByVal computerName)
Set GetRegistryObject = GetWMIObject("winmgmts:\\" &amp; computerName &amp; "\root\default:StdRegProv")
End Function


' Creates an event and sends it back to the mom server without stopping the script.
Function ThrowScriptErrorNoAbort(ByVal message, ByVal oErr)
' Retrieve the name of this (running) script
Dim scriptFileName
scriptFileName = GetScriptName

If Not IsNull(oErr) Then
message = message &amp; " Cause: " &amp; oErr.Description
end if

On Error Resume Next
Dim oAPITemp
Set oAPITemp = CreateObject("MOM.ScriptAPI")
If Err.Number = 0 Then
oAPITemp.LogScriptEvent scriptFileName, SCRIPT_EVENT_ID, SCOM_ERROR, message
End If
On Error Goto 0
End Function


' Creates an error event, sends it back to the mom server, and stops the script.
Function ThrowScriptError(Byval message, ByVal oErr)
On Error Resume Next
ThrowScriptErrorNoAbort message, oErr
WScript.Quit
End Function


' Gets the script name
Function GetScriptName
Dim oFSO
Set oFSO = MOMCreateObject("Scripting.FileSystemObject")
GetScriptName = oFSO.GetFile(WScript.ScriptFullName).Name
set oFSO = nothing
End Function


' Creates an object
Function MOMCreateObject(ByVal name)
'create the object
On Error Resume Next
Set MOMCreateObject = CreateObject(name)
If Err.Number &lt;&gt; 0 Then
ThrowScriptError "Unable to create COM object '" &amp; name &amp; "'", Null
End If
On Error Goto 0
End Function

' Log the message
Sub Log(message, severity)
Dim oTempAPI, scriptName

'get script name
scriptName = GetScriptName

'create a temp mom api object
'(avoids having to pass the object every time or using a global)
Set oTempAPI = MOMCreateObject("MOM.ScriptAPI")

'log event
On Error Resume Next
Call oTempAPI.LogScriptEvent(scriptName, SCRIPT_EVENT_ID, severity, message)
On Error Goto 0
End Sub

</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
<ProbeAction ID="PassThrough" TypeID="System!System.PassThroughProbe"/>
<ConditionDetection ID="FilterUpgradeRequired" TypeID="System!System.ExpressionFilter">
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="Boolean">//DataItem/Property[@Name="UpgradeRequired"]</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="Boolean">true</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</ConditionDetection>
<ConditionDetection ID="FilterUpgradeNotRequired" TypeID="System!System.ExpressionFilter">
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="Boolean">//DataItem/Property[@Name="UpgradeRequired"]</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="Boolean">false</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</ConditionDetection>
</MemberModules>
<RegularDetections>
<RegularDetection MonitorTypeStateID="UpgradeNotRequired">
<Node ID="FilterUpgradeNotRequired">
<Node ID="ScriptProbe">
<Node ID="SchedulerDS"/>
</Node>
</Node>
</RegularDetection>
<RegularDetection MonitorTypeStateID="UpgradeRequired">
<Node ID="FilterUpgradeRequired">
<Node ID="ScriptProbe">
<Node ID="SchedulerDS"/>
</Node>
</Node>
</RegularDetection>
</RegularDetections>
<OnDemandDetections>
<OnDemandDetection MonitorTypeStateID="UpgradeNotRequired">
<Node ID="FilterUpgradeNotRequired">
<Node ID="ScriptProbe">
<Node ID="PassThrough"/>
</Node>
</Node>
</OnDemandDetection>
<OnDemandDetection MonitorTypeStateID="UpgradeRequired">
<Node ID="FilterUpgradeRequired">
<Node ID="ScriptProbe">
<Node ID="PassThrough"/>
</Node>
</Node>
</OnDemandDetection>
</OnDemandDetections>
</MonitorImplementation>
</UnitMonitorType>