Posted in Computers and Internet

Windows 2003 Cluster monitor script for Exchange 2003 server


Hello, Here is my another script I made it to monitor my company’s Exchange 2003 cluster. If you run Exchange 2003 server on Windows 2003 cluster, this might help you.

Here are the needs for this script,

– Exchange cluster group might be failover to another node for some reason. I want to know why it did failover and when. Most importantly, How much time it takes to failover.

– For Better practice, I set "affect the group" settings only to very important core resources. If all other resources fails, it will not affect the group and stays failed. If that happens for any reason. I want to know when it happens.

– Run this script from a standalone server. Do not run this on the cluster node(s) itself. It beats the reason for this script. It uses WMI, so it can run from any Windows 2000, Windows 2003 or XP machine.

It’s basic VBScript and I found the help from MSDN website. Anybody can reuse this script by providing the Exchange cluster server name, an SMTP server name and Administrators who needs to receive email alerts.

NOTE: You need to have an SMTP server other than the Exchange server itself. If the Exchange is down on the cluster, you need to send alert mails via different SMTP server.

Questions, leave me reply. OK Let’s get to the script.


‘ Name: ClusterProbe.vbs
‘ Purpose: Check each Cluster member found for Exchange server,
‘ and Check all properties on the ExchangeClusterResource
‘ objects. If the state is other than 2, send emails
‘ to administrators
‘Written by: Anand Venkatachalapathy
‘Written Date: Sep 9 2006

Dim strAdministrators ‘Who supposed to receive alerts

StrAdministrators = ";"

Dim sSMTpServerName ‘* sSMTPServerName – SMTP Server Name

‘* SMTP server – This server should not be your Exchange server.
‘* If your Exchange cluster is down, you need to send alerts. So, assign it to
‘* a different Server
sSMTPServerName = "YourSMTPServerName"

Check_Cluster_Resources "YourExchangeClusterName"

‘ Name: Check_Cluster_Resources
‘ Purpose: Check each Cluster member found for Exchange server,
‘ and Check all properties on the ExchangeClusterResource
‘ objects. If the state is other than 2, send emails
‘ to administrators
‘ Input: strComputerName [string] the computer to access
‘ Output: If the state is other than 2, calls Alert_Admins sub
‘ to send emails
Public Sub Check_Cluster_Resources ( strComputerName )

Const cWMINameSpace = "root/cimv2/applications/exchange"
Const cWMIInstance = "ExchangeClusterResource"
Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim strWinMgmts ‘ Connection string for WMI
Dim objWMIExchange ‘ Exchange Namespace WMI object
Dim listClusterResources ‘ ExchangeClusterResource collection
Dim objExchangeConnector ‘ A single ExchangeClusterResource WMI object
Dim strResourceName
Dim strVirtualMachine
Dim strNodeName
Dim numResourceState, strStateDescription
Dim strResourceType
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("ClusterProbe.log", ForAppending, True)
f.WriteLine vbCRLF & "————————————————————–"
f.WriteLine Now & "- Checking cluster resources for " & strComputerName

‘ Create the object string, indicating WMI (winmgmts), using the
‘ current user credentials (impersonationLevel=impersonate),
‘ on the computer passed to the function in strComputerName, and
‘ using the CIM namespace for the Exchange provider.
strWinMgmts = "winmgmts:{impersonationLevel=impersonate}!//" & strComputerName & "/" & cWMINameSpace

‘ Get an object using the string you just created.
Set objWMIExchange = GetObject(strWinMgmts)

‘ The Resources that currently exist appear as a list of
‘ ExchangeClusterResource instances in the Exchange namespace.
Set listClusterResources = objWMIExchange.InstancesOf(cWMIInstance)

‘ Were any ExchangeClusterResource Instances returned?
if (listClusterResources.count > 0) then
‘ If yes, do the following:
‘ Iterate through the list of ExchangeClusterResource objects.
For each objExchangeConnector in listClusterResources
‘Following Values are taken from MSDN EXchange/Cluster website
‘Cluster Resource State descriptions:
‘ClusterResourceStateUnknown = -1,
‘ClusterResourceInherited = 0,
‘ClusterResourceInitializing = 1,
‘ClusterResourceOnline = 2,
‘ClusterResourceOffline = 3,
‘ClusterResourceFailed = 4,
‘ClusterResourcePending = 128,
‘ClusterResourceOnlinePending = 129,
‘ClusterResourceOfflinePending = 130
numResourceState = objExchangeConnector.State
strResourceName = objExchangeConnector.Name
strVirtualMachine = objExchangeConnector.VirtualMachine
strNodeName = objExchangeConnector.Owner
strResourceType = objExchangeConnector.Type
If numResourceState <> 2 Then
Select Case numResourceState
Case -1
strStateDescription = "Unknown"
Case 0
strStateDescription = "Inherited"
Case 1
strStateDescription = "Initializing"
Case 2
strStateDescription = "Online"
Case 3
strStateDescription = "Offline"
Case 4
strStateDescription = "Failed"
Case 128
strStateDescription = "Pending"
Case 129
strStateDescription = "OnlinePending"
Case 130
strStateDescription = "OfflinePending"
End Select
f.WriteLine strResourceName & " is NOT online at " & strNodeName
f.WriteLine "Alerting Administrators…."
strTo = strAdministrators
strSub = "<Exchange Cluster> " & strStateDescription & ": " & strResourceName
strBody = strResourceName & "(" & strVirtualMachine & ") is hosted at " & strNodeName & vbCRLF
strBody = strBody & strResourceName & "’state is changed to " & strStateDescription & vbCRLF
strBody = strBody & strResourceName & "’s type is " & strResourceType & vbCRLF & vbCRLF
Alert_Admins strTo,strSub,strBody
f.WriteLine "Alert sent to " & strAdministrators
f.WriteLine strResourceName & " is ONLINE at " & strNodeName
End If

‘ Move to the next ExchangeClusterResource.
‘ If no ExchangeClusterResource instances were returned,
‘ display that.
f.WriteLine "No ExchangeClusterResource instances were returned."
strTo = strAdministrators
strSub = "<Exchange Cluster> " & strComputerName & " is not responding"
strBody = strComputerName & " is not available on the network"
Alert_Admins strTo,strSub,strBody
f.WriteLine "Alert sent to " & strAdministrators
end if
end Sub

‘ Name: Alert_Admins
‘ Purpose: Send email using smtp server.
‘ Input: strTo – Who to send to, strSub – Subject of the message
‘ strBody – Body of the message
‘ Output: Sends the emails to the strTO recipients
Sub Alert_Admins( strTo,strSub,strBody)
‘* iMsg – holds CDO.Message object
‘* Flds – Enumeration for CDO SMTP object properties
‘* iConf – holds CDO.Configuration
Dim iMsg, Flds, iConf

‘* Assign cdoSendUsingPort is set to 2, i.e., send using SMTP (25) port
Const cdoSendUsingPort = 2

‘* Create CDO Objects and assign to variables
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields

‘* Assign values to Flds class properties

With Flds
.Item("") = cdoSendUsingPort
.Item("") = sSMTPServerName
.Item("") = 25
End With

‘* Assign message properties and Send the mail
With iMsg
Set .Configuration = iConf
.Fields("urn:schemas:httpmail:importance").Value = 2 ‘Setting Mail importance to High (2)
.To = strTo
.From = "" ‘Fake, but make-sense email FROM address
.Sender = "" ‘Return Email address
.Subject = strSub
.TextBody = strBody
End With

End Sub


Being in Silicon Valley for years, I became a IT Infrastructure Geek by experience and surrounded by other Geeks everywhere. I try to help others by the solutions I found on odd occasions.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s