Hyper-V 2012 R2 Cluster Discovery

QND.Hyperv2012R2.HyperV.Cluster.ComputerRole.Discovery (Discovery)

Script discovery for Hyper-V Cluster

Element properties:

TargetMicrosoft.Windows.Cluster.VirtualServer
EnabledTrue
Frequency3600
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedScript.DiscoveryProvider Default

Source Code:

<Discovery ID="QND.Hyperv2012R2.HyperV.Cluster.ComputerRole.Discovery" Target="Cluster!Microsoft.Windows.Cluster.VirtualServer" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="QND.Hyperv2012R2.HyperV.Cluster.ComputerRole">
<Property TypeID="QND.Hyperv2012R2.HyperV.Cluster.ComputerRole" PropertyID="ClusterName"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>3600</IntervalSeconds>
<SyncTime/>
<ScriptName>ClusterDiscovery.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ "Virtual Machine" "%"</Arguments>
<ScriptBody><Script>
'========================================================
' AUTHOR: Tao Yang
' Script Name: ClusterDiscovery.vbs
' DATE: 20/03/2014
' Version: 1.0
' COMMENT: Script to discover failover clusters
'========================================================
On Error Resume Next
SourceID = WScript.Arguments(0)
ManagedEntityID = WScript.Arguments(1)
strComputer = WScript.Arguments(2)
strCLResType = WScript.Arguments(3)
strCLResName = WScript.Arguments(4)

'Declare variables
const HKEY_LOCAL_MACHINE = &amp;H80000002

Set oAPI = CreateObject("MOM.ScriptAPI")
Set oDiscoveryData = oAPI.CreateDiscoveryData(0,SourceID,ManagedEntityID)

'Check if Failover Cluster service exists
strKeyPath = "SYSTEM\CurrentControlSet\Services\ClusSvc"
'connect to the registry provider
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &amp; strComputer &amp; "\root\default:StdRegProv")
If oReg.EnumKey(HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys) = 0 Then
'Cluster Service exists, continue, check if specified cluster resource exists
bCLRes = False
CLResWMIQuery = "Select * from MSCluster_Resource Where Type = '" &amp; strCLResType &amp;"' AND Name LIKE '" &amp; strCLResName &amp; "'"
Set objWMICluster = GetObject("winmgmts:\\" &amp; strComputer &amp; "\root\MSCluster")
Set ColCLRes = objWMICluster.ExecQuery (CLResWMIQuery)
For Each objCLRes in ColCLRes
bCLRes = TRUE
Next

'NetBIOS Computer Name
ComputerName = Split(strComputer, ".", -1)(0)
'Read Cluster name from registry
strCLKeyPath = "SYSTEM\CurrentControlSet\Services\ClusSvc\Parameters"
strCLNameValue = "ClusterName"
oReg.GetStringValue HKEY_LOCAL_MACHINE,strCLKeyPath, strCLNameValue,strClusterName

'Proceed if NetBIOS Computer Name equals to cluster name
If UCase(ComputerName) = UCase(strClusterName) Then
IF bCLRes = TRUE THEN
Set oInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='QND.Hyperv2012R2.HyperV.Cluster.ComputerRole']$")
oInstance.AddProperty "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", strComputer
oInstance.AddProperty "$MPElement[Name='System!System.Entity']/DisplayName$", strComputer
oInstance.AddProperty "$MPElement[Name='QND.Hyperv2012R2.HyperV.Cluster.ComputerRole']/ClusterName$", UCase(strClusterName)
oDiscoveryData.AddInstance(oInstance)
END IF
END IF
End If
oAPI.Return oDiscoveryData
</Script></ScriptBody>
<TimeoutSeconds>120</TimeoutSeconds>
</DataSource>
</Discovery>