Windows 2008 클러스터 리소스 그룹 검색 프로브

Microsoft.Windows.2008.Cluster.ResourceGroups.Discovery.ScriptProbe (ProbeActionModuleType)

Element properties:

TypeProbeActionModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.Windows.Cluster.PrivilegedAccount
InputTypeSystem.BaseData
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
Script ProbeAction Microsoft.Windows.ScriptDiscoveryProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
Timeoutint$Config/Timeout$Timeout(sec)

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.2008.Cluster.ResourceGroups.Discovery.ScriptProbe" Accessibility="Internal" RunAs="Cluster!Microsoft.Windows.Cluster.PrivilegedAccount" Batching="false" PassThrough="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="DiscoverySourceId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="ClusterName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Timeout" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="Timeout" Selector="$Config/Timeout$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<ProbeAction ID="Script" TypeID="Windows!Microsoft.Windows.ScriptDiscoveryProbe">
<ScriptName>DiscoverWindows2008ResourceGroups.vbs</ScriptName>
<Arguments>$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$ $Config/ClusterName$ $Config/DiscoverySourceId$ $Target/Id$</Arguments>
<ScriptBody><Script>'Copyright (c) Microsoft Corporation. All rights reserved.
Option Explicit
SetLocale("en-us")

Const DiscoveryScriptName = "DiscoverWindows2008ResourceGroups.vbs"
Const ScriptEventId = 7008
Const EventTypeError = 1
Const EventTypeWarning = 2
Const EventTypeInformation = 3

Const Start_SnapShotDiscovery = 0
Const Exit_SnapShotDiscovery = 1
Const Exit_IncrementalDiscovery = 2

const ClusterCoreGroupId = "$MPElement[Name='Microsoft.Windows.2008.Cluster.CoreClusterGroup']$"
const AvailableStorageGroupId = "$MPElement[Name='Microsoft.Windows.2008.Cluster.AvailableStorageGroup']$"
const ClusterNamePropId = "$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ClusterName$"
const ObjectNamePropId = "$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ObjectName$"
Const OSversionNumber = "6.0,6.1"

Call Main

Sub Main

On Error Resume Next

Dim healthServiceName
Dim clusterName
Dim sourceId
Dim managedEntityId
Dim message

Dim oAPI, oDiscoveryData
Dim groups
Dim result
Dim DiscoveryType

result = InitMomAPi(oAPI)

If (False = result) Then
Exit Sub
End If

result = CheckInitialization(healthServiceName,clusterName,sourceId,managedEntityId,oAPI,oDiscoveryData)

If (False = result) Then
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If

DiscoveryType = GetSnapshotDiscovery(OSversionNumber,oAPI)

If (Exit_IncrementalDiscovery = DiscoveryType) Then
oDiscoveryData.IsSnapshot = False
End If

If (Start_SnapShotDiscovery &lt;&gt; DiscoveryType) Then
oAPI.Return(oDiscoveryData)
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If


result = GetWmiGroups(groups,healthServiceName)
If (False = result) Then
oDiscoveryData.IsSnapshot = False
oAPI.Return(oDiscoveryData)
message = "Cannot get data from Wmi."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Set groups = Nothing
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If

result = DoDiscovery(groups,clusterName,oDiscoveryData)

If (False = result) Then
message = "Discovery failled."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Set oDiscoveryData = Nothing
result = InitDiscoveryData(oAPI,oDiscoveryData,sourceId, managedEntityId,False)

End If

oAPI.Return(oDiscoveryData)

Set groups = Nothing
Set oDiscoveryData = Nothing
Set oAPI = Nothing

On Error Goto 0
End Sub

Function HasValue(Value)

Dim bNothing

bNothing = false

IF ( IsObject(Value) ) THEN
IF (Nothing is Value) THEN
bNothing = true
END IF
END IF

HasValue = Not ( IsEmpty(Value) or bNothing or IsNull(Value) )
End Function

Function CheckInitialization(ByRef healthServiceName,ByRef clusterName,ByRef sourceId,ByRef managedEntityId,oAPI,ByRef oDiscoveryData )
On Error Resume Next

Dim message
Dim result

Err.Clear
result = False
CheckInitialization = False

result = GetScriptParameters(healthServiceName,clusterName,sourceId,managedEntityId)

If (False = result) Then
message = "Cannot initialize script parameters. healthServiceName :" &amp; healthServiceName &amp; " clusterName : " &amp; clusterName &amp; " sourceId: " &amp; sourceId &amp; " managedEntityId:" &amp; managedEntityId
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Exit Function
End If

result = InitDiscoveryData(oAPI,oDiscoveryData,sourceId, managedEntityId,True)
If (False = result) Then
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Set oAPI = Nothing
Set oDiscoveryData = Nothing
End If

CheckInitialization = result

End Function

Function GetScriptParameters(ByRef healthServiceName,ByRef clusterName,ByRef sourceId,ByRef managedEntityId)
On Error Resume Next

GetScriptParameters = False
Err.Clear

Dim oArgs
Dim Count

Set oArgs = WScript.Arguments

If (0 &lt;&gt; Err.number) Then
Exit Function
End If

Count = oArgs.Count
If (Count &lt; 4) Then
Exit Function
End If

healthServiceName = ""
clusterName = ""
sourceId = ""
managedEntityId = ""

healthServiceName = oArgs(0)
clusterName = oArgs(1)
sourceId = oArgs(2)
managedEntityId = oArgs(3)

If ((False = HasValue(healthServiceName)) Or (False = HasValue(clusterName )) Or (False = HasValue(sourceId)) Or (False = HasValue(managedEntityId)) ) Then
Exit Function
End If

If (0 = Len(healthServiceName)) Then
healthServiceName = "."
End If

GetScriptParameters = True

On Error Goto 0
End Function

Function GetWmiGroups(ByRef groups,ByVal healthServiceName)
On Error Resume Next

Dim Namespace,LocalNamespace,Count
Dim wmi

GetWmiGroups = False
Namespace = "winmgmts:\\" + healthServiceName &amp; "\root\mscluster"
LocalNamespace = "winmgmts:\\.\root\mscluster"

Err.Clear
Set wmi = GetObject(Namespace)

If ( (False = HasValue(wmi)) Or (0 &lt;&gt; Err.Number) ) Then
If (Lcase(LocalNamespace) &lt;&gt; Lcase(Namespace) ) Then
Err.Clear
Set wmi = GetObject(LocalNamespace)
If ( (False = HasValue(wmi)) Or (0 &lt;&gt; Err.Number) ) Then
Set wmi = Nothing
Exit Function
End If
Else
Set wmi = Nothing
Exit Function
End If

End If

Set groups = wmi.ExecQuery("SELECT Name FROM MSCluster_ResourceGroup")
If (0 &lt;&gt; Err.Number) Then
Set wmi = Nothing
Set groups = Nothing
Exit Function
End If

Count = groups.Count
Set wmi = Nothing

GetWmiGroups = (0 = Err.Number)

End Function

Sub LogScomEvent(ScriptName,EventId,EventType,message,momAPI)
On Error Resume Next

Err.Clear

If (False = HasValue(momAPI)) Then
Set momAPI = CreateObject("MOM.ScriptAPI")

If ((False = HasValue(momAPI)) Or (0 &lt;&gt; Err.Number)) Then
Err.Clear
Exit SUb
End If
End If

Call momAPI.LogScriptEvent (ScriptName, EventId, EventType, message)

On Error Goto 0
End Sub

Function InitMomAPI(ByRef momAPI)
On Error Resume Next

InitMomAPi = False
Err.Clear
Set momAPI = CreateObject("MOM.ScriptAPI")

If ((False = HasValue(momAPI)) Or (0 &lt;&gt; Err.Number )) Then

WScipt.Echo "Failed to get MOM API. MOM v3 must be installed to execute this script."
If ( 0 &lt;&gt; Len(Err.Description)) Then
WScipt.Echo "Error: " &amp; Err.Description
End If
Err.Clear
Else
InitMomAPI = True
End If

On Error Goto 0
End Function

Function InitDiscoveryData(momAPI,ByRef DiscoveryData,sourceId, managedEntityId,IsSnapShot)
On Error Resume Next

InitDiscoveryData = False
Err.Clear

If (False = HasValue(momAPI)) Then
Exit Function
End If

Dim message
Set DiscoveryData = momAPI.CreateDiscoveryData(0, sourceId, managedEntityId)
If ((False = HasValue(DiscoveryData)) Or (0 &lt;&gt; Err.Number)) Then
message = "Failed to get Discovery Data Object."
message = GetErrorMessage(message)

Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,momAPI)
Err.Clear
Else
DiscoveryData.IsSnapshot = IsSnapShot
InitDiscoveryData = (0 = Err.number)
End If

On Error Goto 0
End Function

Function GetErrorMessage(message)

If ( 0 &lt;&gt; Len(Err.Description)) Then
message = message &amp; "Error: Id: " &amp; Err.number &amp; " Description:" &amp; Err.Description
End If

GetErrorMessage = message
End Function

Function DoDiscovery(groups,clusterName,ByRef DiscoveryData)

Dim groupType
Dim coreClustGroupInst
Dim availableStorageGroupInst
Dim result
Dim group

On Error Resume Next

result = False
DoDiscovery = result

result = true

For Each group in groups
groupType = group.ExecMethod_("GetGroupType").ReturnValue

If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

If groupType = 1 Then

Set coreClustGroupInst = DiscoveryData.CreateClassInstance(ClusterCoreGroupId)

coreClustGroupInst.AddProperty ClusterNamePropId,clusterName
coreClustGroupInst.AddProperty ObjectNamePropId,group.Name
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

DiscoveryData.AddInstance coreClustGroupInst
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

ElseIf groupType = 2 then

Set availableStorageGroupInst = DiscoveryData.CreateClassInstance(AvailableStorageGroupId)

availableStorageGroupInst.AddProperty ClusterNamePropId,clusterName
availableStorageGroupInst.AddProperty ObjectNamePropId,group.Name
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

DiscoveryData.AddInstance availableStorageGroupInst
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

End If
Next

Set group = Nothing

DoDiscovery = result

End Function

Function GetOsFilter(OSVersion,delimiter)

On Error Resume Next
Err.Clear

Dim Filter,Prefix,Separator,EndClause
Dim OsVersions,SubFilter

Filter = " where ProductType != 1"
GetOSFilter = Filter

If (Not HasValue(OSVersion) or 0 = Len(OSVersion)) Then
Exit Function
End If
If (Not HasValue(delimiter)) Then
delimiter = ","
End If

If (delimiter = OSVersion) Then
Exit Function
End If

Prefix = " and (Version like '"
Separator = "%' or Version like '"
EndClause = "%')"

OsVersions = Split(OSVersion,delimiter)

SubFilter = Join(OsVersions,Separator)
Filter = Filter &amp; Prefix &amp; SubFilter &amp; EndClause

GetOSFilter = Filter

On Error Goto 0
End Function

Function GetServerOsVersionCheck(sComputerName,OsVersion,ByRef IsError,ByVal oAPI)

On Error Resume Next

Err.Clear

Dim strQuery,oWmiSet, sWmiTarget, Count, Filter
IsError = False
GetServerOsVersionCheck = False

If ( IsObject(OsVersion)) Then
Exit Function
End If

sWmiTarget = "."

If ( Not IsObject(sComputerName)) Then
If (HasValue(sComputerName) and Len(sComputerName) &gt; 0 ) Then
sWmiTarget = "" &amp; sComputerName
End If
End If

sWmiTarget = "winmgmts:\\" &amp; sWmiTarget &amp; "\root\cimv2"
Filter = GetOsFilter(OsVersion,",")
StrQuery = "select Version from Win32_OperatingSystem" &amp; Filter
Set oWmiSet = WMIExecQueryNoAbort(sWmiTarget, strQuery,oAPI)

If Err.Number &lt;&gt; 0 Then
IsError = True
Exit Function
End If

Count = oWmiSet.Count
If Err.Number &lt;&gt; 0 Then
IsError = True
Exit Function
End If

GetServerOsVersionCheck = ( Count &gt; 0)

On Error Goto 0
End Function

Function GetSnapshotDiscovery(OsVersion,ByVal oAPI)

Dim bIsOsValid,bIsError,iResult

On Error Resume Next

bIsOsValid = GetServerOsVersionCheck(".",OsVersion,bIsError,oAPI)

If (bIsOsValid) Then
iResult = Start_SnapShotDiscovery
Else
If (bIsError) Then
iResult = Exit_IncrementalDiscovery
Else
iResult = Exit_SnapShotDiscovery
End IF

End If

GetSnapshotDiscovery = iResult
End Function

Function WMIExecQueryNoAbort(ByVal sNamespace, ByVal sQuery, ByVal oAPI)

Dim oWMI, oQuery, nInstanceCount, message

Set WMIExecQueryNoAbort = Nothing

On Error Resume Next
Err.Clear
Set oWMI = GetObject(sNamespace)

If ((False = HasValue(oWMI)) Or (0 &lt;&gt; Err.number)) Then
message = "Unable to open WMI Namespace '" &amp; sNamespace &amp; "'. Check to see if the WMI service is enabled and running, and ensure this WMI namespace exists."
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Set oWMI = Nothing
Exit Function
End If

Set oQuery = oWMI.ExecQuery(sQuery)

If ((False = HasValue(oQuery)) Or (0 &lt;&gt; Err.number)) Then
message = "The Query '" &amp; sQuery &amp; "' returned an invalid result set. Please check to see if this is a valid WMI Query."
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Exit Function
End If

Set oWMI = Nothing

Set WMIExecQueryNoAbort = oQuery


End Function



</Script></ScriptBody>
<TimeoutSeconds>$Config/Timeout$</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="Script"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
<InputType>System!System.BaseData</InputType>
</ProbeActionModuleType>