Const EVENT_ID_SUCCESS = 1000 'Use IDs in the range 1 - 1000
Const EVENT_ID_SCRIPTERROR = 999 'Then you can use eventcreate.exe to test the MP
'Scripting.FileSystemObject constants
Const FOR_READING = 1 'Open a file for reading only. You can't write to this file.
Const FOR_WRITING = 2 'Open a file for writing.
Const FOR_APPENDING = 8 'Open a file and write to the end of the file.
Const SCRIPT_SUCCESS = 0
Const SCRIPT_WITH_ERROR = 1
'Global vars
Dim mblnLogSuccessEvent 'As Boolean
Dim mstrIdentifier 'As String
On Error Resume Next
Call Main
'*********************************************************************************************
' PROCEDURE: Main
' DESCRIPTION: Reads the script parameters and creates the cluster disks discovery data.
' PARAMETERS: void
'*********************************************************************************************
Private Sub Main()
' Targeted at Microsoft.Windows.Cluster.VirtualServer (based on Microsoft.Windows.Server.Computer)
Dim objFSO 'As Scripting.FileSystemObject
Dim strSourceID 'As String '= oArgs(4). strSourceId is the GUID of the discovery object that runs the script (MPElement).
Dim strManagedEntityId 'As String '= oArgs(5) - strManagedEntityId is the GUID of the computer class that is targeted by the script (Target/Id).
Dim strTargetComputer 'As String '= oArgs(6)
Dim strClusterName 'As String '= oArgs(7)
Dim objMomScriptAPI 'As MOM.ScriptAPI
Dim objDiscoveryData 'As DiscoveryData
Dim intSuccess 'As Integer
Call SetLocale("en-us")
Set objMomScriptAPI = CreateObject("MOM.ScriptAPI")
If Not GetScriptParameters(strSourceID, strManagedEntityId, strTargetComputer, strClusterName) Then
' If the script is called without the required arguments,
' create an information event and then quit.
Call objMomScriptAPI.LogScriptEvent(WScript.ScriptName, EVENT_ID_SCRIPTERROR, EVENT_TYPE_WARNING, "-- Cluster Disks Discovery Script -- The script was called with fewer than six arguments or the arguments could not be parsed.")
WScript.Quit -1
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Create new discovery data object
If mblnLogSuccessEvent Then
Call objMomScriptAPI.LogScriptEvent(WScript.ScriptName, EVENT_ID_SUCCESS, EVENT_TYPE_INFORMATION,"before create discovery data")
End If
Set objDiscoveryData = objMomScriptAPI.CreateDiscoveryData(0, strSourceID, strManagedEntityId)
If intSuccess = SCRIPT_SUCCESS Then
If mblnLogSuccessEvent Then
Call objMomScriptAPI.LogScriptEvent(WScript.ScriptName, EVENT_ID_SUCCESS, EVENT_TYPE_INFORMATION, "-- Cluster Disks Discovery Script -- Script executed successfully.")
End If
'Return discovery data
Call objMomScriptAPI.Return(objDiscoveryData)
Else
Call objMomScriptAPI.LogScriptEvent(WScript.ScriptName, EVENT_ID_SUCCESS, EVENT_TYPE_INFORMATION, "-- Cluster Disks Discovery Script -- An error occurred while running the script.")
End If
End Sub
'****************************************************************************************************************
' FUNCTION: DiscoverClusterDisks
' DESCRIPTION: Discover instances of the class 'Microsoft.Windows.Server.ClusterDisksMonitoring.ClusterDisk' using WMI.
' PARAMETERS: IN String strTargetComputer: principal name of the targeted 'Microsoft.Windows.Cluster.VirtualServer' instance.
' IN String strClusterName: the cluster containing the cluster shared volume
' OUT Object objDiscoveryData: initialised DiscoveryData instance
' RETURNS: Integer: 0 if successful and 1 if fails
'****************************************************************************************************************
Private Function DiscoverClusterDisks(ByRef strTargetComputer, ByRef strClusterName, ByRef objDiscoveryData) 'As Integer
Dim objMSClusterSWbemServices 'As SWbemServices
Dim objClusterResources 'As SWbemObject
Dim objClusterResource 'As SWbemObject
Dim objClusterDisk 'As SWbemObject
Dim objClusterDiskPartition 'As SWbemObject
Dim intSuc 'As Integer
Dim objClusterResNetworks
Dim objClusterResNet
Dim objResGroupAsc
Dim strDnsName
Dim strGroupName
Dim blnUseResource
Dim objResourceGroups
Dim objResourceGroup
blnUseResource = false
'Connect to WMI NS \\.\root\MSCluster
If ConnectToWbemNS(".", WMI_MSCLUSTER_NAMESPACE, objMSClusterSWbemServices) Then
Set objClusterResNetworks = objMSClusterSWbemServices.ExecQuery("select * from " & WMI_MSCLUSTER_CLUSTER_RESOURCE & " where Type = 'Network Name'")
If Err.number <> 0 Then
DiscoverClusterDisks = SCRIPT_WITH_ERROR
Exit Function
End If
on error goto 0
For Each objClusterResNet In objClusterResNetworks
strDnsName = objClusterResNet.PrivateProperties.DnsName
If InStr(strTargetComputer, ".") > 0 Then
If LCase(Left(strTargetComputer, InStr(strTargetComputer, ".") - 1)) = LCase(strDnsName) Then
blnUseResource = True
else
blnUseResource = false
End If
Else
If LCase(strTargetComputer) = LCase(strDnsName) Then
blnUseResource = True
else
blnUseResource = false
End If
End If
If blnUseResource = true Then
For Each objResGroupAsc In objClusterResNet.Associators_(WMI_MSCLUSTER_RESOURCEGROUP_TO_RESOURCE, "", "", "", False, False, "", "", 0)
strGroupName = objResGroupAsc.Name
Next
End If
Next
Set objResourceGroups = objMSClusterSWbemServices.ExecQuery("select * from " & WMI_MSCLUSTER_RESOURCEGROUP)
If Err.number <> 0 Then
DiscoverClusterDisks = SCRIPT_WITH_ERROR
Exit Function
End If
on error goto 0
For Each objResourceGroup In objResourceGroups
If LCase(objResourceGroup.Name) = LCase(strGroupName) Then
For Each objClusterResource In objResourceGroup.Associators_(WMI_MSCLUSTER_RESOURCEGROUP_TO_RESOURCE, "", "", "", False, False, "", "", 0)
'Get the associated disk partition
For Each objClusterDisk In objClusterResource.Associators_(WMI_CLUSTER_RESOURCE_TO_DISK_ASSOCIATOR_CLASS, "", "", "", False, False, "", "", 0)
'Get the associated resource
For Each objClusterDiskPartition In objClusterDisk.Associators_(WMI_CLUSTER_DISKPARTITION_TO_DISK_ASSOCIATOR_CLASS, "", "", "", False, False, "", "", 0)
intSuc = CreateDiscoveryData(objClusterDisk, objClusterDiskPartition, objClusterResource, _
strTargetComputer, strClusterName, objDiscoveryData)
Next
Next
Next
If Err.number <> 0 Then
DiscoverClusterDisks = SCRIPT_WITH_ERROR
Exit Function
End If
on error goto 0
Else
DiscoverClusterDisks = SCRIPT_SUCCESS
End If
Next
DiscoverClusterDisks = intSuc
Else
End If
End Function
'****************************************************************************************************************
' FUNCTION: CreateDiscoveryData
' DESCRIPTION: Create discovery data for
' <ClassType ID="Microsoft.Windows.Server.ClusterDisksMonitoring.ClusterDisk" Accessibility="Internal" Abstract="false" Base="Windows!Microsoft.Windows.ApplicationComponent" Hosted="true" Singleton="false">
' <Property ID="ClusterResourceName" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
' <Property ID="ClusterDiskName" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
' <Property ID="PartitionName" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
' <Property ID="PartitionFileSystem" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
' <Property ID="PartitionSize" Type="int" Key="false" />
' <Property ID="ClusterName" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
' <Property ID="VolumeLabel" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
' </ClassType>
'
' PARAMETERS: IN Object objClusterResource: the cluster disks as SWbemObject of type MSCluster_Disk.
' IN Object objClusterDiskPartition: the associated disk partition as SWbemObject of type MSCluster_DiskPartition.
' IN Object objClusterResource: the associated cluster resource as SWbemObject of type MSCluster_Resource.
' IN String strTargetComputer: the principal name of the targeted cluster virtual server hosting the cluster shared volume,
' i.e. the cluster name and not the current owner!
' IN String strClusterName: the cluster containing the cluster shared volume
' OUT Object objDiscoveryData: initialised DiscoveryData instance
' RETURNS: Integer: 0 if successful or 1 if Error
'****************************************************************************************************************
Private Function CreateDiscoveryData(ByRef objClusterDisk, ByRef objClusterDiskPartition, ByRef objClusterResource, _
ByRef strTargetComputer, ByRef strClusterName, ByRef objDiscoveryData) 'As Integer
Dim objCSVInstance 'As MOMClassInstance
'Create the cluster shared volume instance hosted on the targeted cluster virtual server
Set objCSVInstance = objDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.Server.ClusterDisksMonitoring.ClusterDisk']$")
'ClusterSharedVolumeName (key)
Call objCSVInstance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.ClusterDisksMonitoring.ClusterDisk']/ClusterResourceName$", objClusterResource.Properties_(WMI_NAME_PROPERTY_NAME) & "_" & objClusterDiskPartition.Properties_(WMI_PATH_PROPERTY_NAME))
If Err.number <> 0 Then
CreateDiscoveryData = SCRIPT_WITH_ERROR
Exit Function
End If
'******************************************************************************
' FUNCTION: GetScriptParameters
' DESCRIPTION: Reads the script's parameters
' and sets the global variables.
'
' PARAMETERS: OUT String strSourceID: Id of MP element ($MPElement$)
' OUT String strManagedEntityId: Id of targeted entity ($Target/Id$)
' OUT String strTargetComputer: Principal name of executing computer
' (-Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName-)
' OUT String strClusterName: Cluster name
' RETURNS: Boolean: True if successful
'******************************************************************************
Private Function GetScriptParameters(ByRef strSourceID, ByRef strManagedEntityId, ByRef strTargetComputer, ByRef strClusterName) 'As Boolean
Dim objArguments
On Error Resume Next
'cmdline: <script> True|False <path to debug log> True|False <script id> .MPElement. .Target/Id. .Target/Host/Property[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName.
Set objArguments = WScript.Arguments
If objArguments.Count < 6 Then Exit Function
If Len(strSourceID) > 0 And Len(strManagedEntityId) > 0 And Len(strTargetComputer) > 0 And Len(strClusterName) > 0 Then GetScriptParameters = True
End Function
'******************************************************************************
' FUNCTION: ConnectToWbemNs
' DESCRIPTION: Connects to a WMI namespace
' PARAMETERS: IN String strServerName: name of the computer. If empty the local computer will be used.
' IN String strNameSpace: WMI namespace
' OUT Object objSWbemServices: WbemScripting.SWbemServices object connected to the given
' namespace on the given server
' RETURNS: Boolean: True if successful
'******************************************************************************
Private Function ConnectToWbemNS(ByRef strServerName, ByRef strNameSpace, ByRef objSWbemServices) 'As Boolean
Dim objSWbemLocator 'as WbemScripting.SWbemLocator
'Create a new WMI Locator object
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
'Connect to WMI namespace on strServerName computer and create WMI Services object
Set objSWbemServices = objSWbemLocator.ConnectServer(strServerName, strNameSpace)
'Connect to WMI namespace on strServerName computer with alternative credentials and create WMI Services object
'Set objSWbemServices = objSWbemLocator.ConnectServer(strServerName, strNameSpace, strUserName, strPassWd)
'If object is initialised function will be successful
If objSWbemServices Is Nothing Then ConnectToWbemNS = False Else ConnectToWbemNS = True