msexchangeserver.vbs - vbscript script by ActiveXperts Software
msexchangeserver.vbs checks whether MS Exchange Server is running; it checks services, processes and performance counters.
Use msexchangeserver.vbs directly from ActiveXperts Network Monitor; in the Manager's 'Monitor' menu, select 'New Check (Script)' and select msexchangeserver.vbs. Configure the required parameter, or press 'Load a working sample'.
In ActiveXperts Network Monitor, Administrators can use three different scripting languages: Powershell, VBScript and SSH.
msexchangeserver.vbs script code
' /////////////////////////////////////////////////////////////////////////////// ' // ActiveXperts Network Monitor - VBScript based checks ' // For more information about ActiveXperts Network Monitor and VBScript, visit ' // http://www.activexperts.com/support/network-monitor/online/vbscript/ ' /////////////////////////////////////////////////////////////////////////////// Option Explicit ' Declaration of global variables Dim SYSDATA, SYSEXPLANATION ' SYSDATA is displayed in the 'Data' column in the Manager; SYSEXPLANATION in the 'LastResponse' column ' Constants - return values Const retvalUnknown = 1 ' ActiveXperts Network Monitor functions should always return True (-1, Success), False (0, Error) or retvalUnknown (1, Uncertain) ' Constants - indexes used in arrays Const idxServiceShortname = 0 ' Const idxServiceLongname = 1 Const idxPerfObject = 0 Const idxPerfContext = 1 Const idxPerfItem = 2 Const idxPerfCondition = 3 ' // To test a function outside Network Monitor (e.g. using CSCRIPT from the ' // command line), remove the comment character (') in the following lines: ' Dim bResult 'bResult = CheckExchange( "localhost", "", "2010" ) 'WScript.Echo "Return value: [" & bResult & "]" 'WScript.Echo "SYSDATA: [" & SYSDATA & "]" 'WScript.Echo "SYSEXPLANATION: [" & SYSEXPLANATION & "]"' Function CheckExchange( strHost, strAltCredentials, strVersion ) ' Description: ' Checks if MS Exchange is running; it checks the MS Exchange services, MS Exchange processes and MS Exchange performance counters ' Parameters: ' 1) strHost As String - Hostname or IP address of the server you want to check ' 2) strAltCredentials As String - Specify an empty string to use Network Monitor service credentials. ' To use alternate credentials, enter a server that is defined in Server Credentials table. ' (To define Server Credentials, choose Tools->Options->Server Credentials) ' 3) strVersion As String - Exchange Server version (either 2013, 2010, 2007, 2000 or 5.5) ' Usage: ' CheckExchange( "<Hostname | IP>", "<Empty String | Server>", "<Exchange-version>" ) ' Sample: ' CheckExchange( "localhost", "", "2010" ) Dim strAltLogin, strAltPassword, objWMIService, numResult Dim lstServices, lstProcesses, lstPerfCounters CheckExchange = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager strAltLogin = "" strAltPassword = "" ' Retrieve product processes/services/performance-counters list If( Not getSoftwareInfo( strVersion, lstServices, lstProcesses, lstPerfCounters, SYSEXPLANATION ) ) Then Exit Function End If ' If alternate credentials are specified, retrieve the alternate login and password from the ActiveXperts global settings If( strAltCredentials <> "" ) Then If( Not getCredentials( strHost, strAltCredentials, strAltLogin, strAltPassword, SYSEXPLANATION )) Then Exit Function End If End If ' WMI Connect If( Not wmiConnect( strHost, strAltLogin, strAltPassword, objWMIService, SYSEXPLANATION ) ) Then Exit Function End If ' Check services numResult = checkServices( objWMIService, strHost, lstServices, SYSEXPLANATION ) If( numResult <> True ) Then CheckExchange = numResult Exit Function End If ' Check processes numResult = checkProcesses( objWMIService, strHost, lstProcesses, SYSEXPLANATION ) If( numResult <> True ) Then CheckExchange = numResult Exit Function End If ' Check performance counters numResult = checkPerfCounters( strHost, strAltLogin, strAltPassword, lstPerfCounters, SYSEXPLANATION ) If( numResult <> True ) Then CheckExchange = numResult Exit Function End If CheckExchange = True SYSEXPLANATION = "All services, processes and counters successfully checked" End Function ' ////////////////////////////////////////////////////////////////////////////// ' // --- Private Functions section --- ' // Private functions names should start with a lower case character, so they ' // will not be listed in the Network Monitor's function browser. ' ////////////////////////////////////////////////////////////////////////////// Function getSoftwareInfo( strVersion, BYREF lstServices, BYREF lstProcesses, BYREF lstPerfCounters, BYREF strSysExplanation ) ' // Retrieve services, processes and counters associated to the specific version of the software. Entries that start ' // with '!' are optional services/processes/counters and are not checked by deault. Remove '!' mark to enable monitoring those items. getSoftwareInfo = True Select Case strVersion Case "2013" lstServices = array( _ array( "MSExchangeADTopology", "Microsoft Exchange Active Directory Topology" ), _ array( "MSExchangeAntispamUpdate" , "Microsoft Exchange Anti-spam Update" ), _ array( "!MSExchangeDiagnostics", "Microsoft Exchange Diagnostics" ), _ array( "MSExchangeEdgeSync", "Microsoft Exchange EdgeSync" ), _ array( "!MSExchangeHM", "Microsoft Exchange Health Manager" ), _ array( "!MSExchangeMonitoring", "Microsoft Exchange Monitoring" ), _ array( "!HostControllerService", "Microsoft Exchange Search Host Controller" ), _ array( "MSExchangeServiceHost", "Microsoft Exchange Service Host" ), _ array( "MSExchangeTransport", "Microsoft Exchange Transport" ), _ array( "MSExchangeTransportLogSearch", "Microsoft Exchange Transport Log Search" ) ) lstProcesses = array( "Microsoft.Exchange.Directory.TopologyService.exe", "Microsoft.Exchange.AntispamUpdateSvc.exe", "!Microsoft.Exchange.Diagnostics.Service.exe", "Microsoft.Exchange.EdgeSyncSvc.exe", "!MSExchangeHMHost.exe", _ "!Microsoft.Exchange.Monitoring.exe", "!hostcontrollerservice.exe", "Microsoft.Exchange.ServiceHost.exe", "MSExchangeTransport.exe", "MSExchangeTransportLogSearch.exe" ) lstPerfCounters = array( _ array( "Memory", "", "Available Bytes", ">104857600" ), _ array( "Processor", "_TOTAL", "% Processor Time", "<90" ) ) Case "2010" lstServices = array( _ array( "MSExchangeAB", "Microsoft Exchange Address Book" ), _ array( "MSExchangeADTopology", "Microsoft Exchange Active Directory Topology" ), _ array( "MSExchangeAntispamUpdate", "Microsoft Exchange Anti-spam Update" ), _ array( "MSExchangeEdgeSync", "Microsoft Exchange EdgeSync" ), _ array( "MSExchangeFBA", "Microsoft Exchange Forms-Based Authentication service" ), _ array( "MSExchangeFDS", "Microsoft Exchange File Distribution" ), _ array( "!MSExchangeImap4", "Microsoft Exchange IMAP4" ), _ array( "MSExchangeIS", "Microsoft Exchange Information Store" ), _ array( "MSExchangeMailboxAssistants", "Microsoft Exchange Mailbox Assistants" ), _ array( "MSExchangeMailboxReplication", "Microsoft Exchange Mailbox Replication" ), _ array( "MSExchangeMailSubmission", "Microsoft Exchange Mail Submission" ), _ array( "!MSExchangeMonitoring", "Microsoft Exchange Monitoring" ), _ array( "!MSExchangePop3", "Microsoft Exchange POP3" ), _ array( "MSExchangeProtectedServiceHost", "Microsoft Exchange Protected Service Host" ), _ array( "!MSExchangeRepl", "Microsoft Exchange Replication" ), _ array( "MSExchangeRPC", "Microsoft Exchange RPC Client Access" ), _ array( "MSExchangeSA", "Microsoft Exchange System Attendant" ), _ array( "!MSExchangeSearch", "Microsoft Exchange Search Indexer" ), _ array( "MSExchangeServiceHost", "Microsoft Exchange Service Host" ), _ array( "!MSExchangeThrottling", "Microsoft Exchange Throttling" ), _ array( "!MSExchangeTransport", "Microsoft Exchange Transport" ), _ array( "!MSExchangeTransportLogSearch", "Microsoft Exchange Transport Log Search" ) ) lstProcesses = array( "Microsoft.Exchange.AddressBook.Service.exe", "MSExchangeADTopologyService.exe", "Microsoft.Exchange.AntispamUpdateSvc.exe", _ "Microsoft.Exchange.EdgeSyncSvc.exe", "ExFBA.exe", "MSExchangeFDS.exe", "Microsoft.Exchange.Imap4Service.exe", _ "store.exe", "MSExchangeMailboxAssistants.exe", "MSExchangeMailboxReplication.exe", "MSExchangeMailSubmission.exe", _ "!Microsoft.Exchange.Monitoring.exe", "!Microsoft.Exchange.Pop3Service.exe", "Microsoft.Exchange.ProtectedServiceHost.exe", _ "msexchangerepl.exe", "Microsoft.Exchange.RpcClientAccess.Service.exe", "mad.exe", "!Microsoft.Exchange.Search.ExSearch.exe", _ "Microsoft.Exchange.ServiceHost.exe", "!MSExchangeThrottling.exe", "!MSExchangeTransport.exe", "!MSExchangeTransportLogSearch.exe" ) lstPerfCounters = array( _ array( "Memory", "", "Available Bytes", ">104857600" ), _ array( "Processor", "_TOTAL", "% Processor Time", "<90" ) ) Case "2007" lstServices = array( _ array( "msexchangeadtopology", "Microsoft Exchange Active Directory Topology Service" ), _ array( "msexchangeantispamupdate", "Microsoft Exchange Anti-spam Update" ), _ array( "msexchangeedgesync", "Microsoft Exchange EdgeSync" ), _ array( "msexchangefds", "Microsoft Exchange File Distribution" ), _ array( "msexchangeantispamupdate", "Microsoft Exchange IMAP4" ), _ array( "msexchangeis", "Microsoft Exchange Information Store" ), _ array( "msexchangemailsubmission", "Microsoft Exchange Mail Submission" ), _ array( "msexchangemailboxassistants", "Microsoft Exchange Mailbox Assistants" ), _ array( "!msexchangemonitoring", "Microsoft Exchange Monitoring" ), _ array( "!msexchangepop3", "Microsoft Exchange POP3" ), _ array( "msexchangerepl", "Microsoft Exchange Replication Service" ), _ array( "msexchangesearch", "Microsoft Exchange Search Indexer" ), _ array( "msexchangeservicehost", "Microsoft Exchange Service Host" ), _ array( "msexchangesa", "Microsoft Exchange System Attendant" ), _ array( "msexchangetransport", "Microsoft Exchange Transport" ), _ array( "msexchangetransportlogsearch", "Microsoft Exchange Transport Log Search" ) ) lstProcesses = array( "" ) lstPerfCounters = array( _ array( "Memory", "", "Available Bytes", ">104857600" ), _ array( "Processor", "_TOTAL", "% Processor Time", "<90" ) ) Case "2000" lstServices = array( _ array( "resvc", "Microsoft Exchange Routing Engine" ), _ array( "msexchangeis", "Microsoft Exchange Information Store" ), _ array( "!msexchangees", "Microsoft Exchange Event" ), _ array( "msexchangesa", "Microsoft Exchange System Attendant" ), _ array( "imap4svc", "Microsoft Exchange IMAP4" ), _ array( "pop3svc", "Microsoft Exchange POP3" ), _ array( "msexchangemta", "Microsoft Exchange MTA Stacks" ), _ array( "!w3svc", "World Wide Web Publishing Service" ), _ array( "!msexchangesrs", "Microsoft Exchange Site Replication Service" ), _ array( "!smtpsvc", "Simple Mail Transport Protocol (SMTP)" ), _ array( "!nntpsvc", "Network News Transport Protocol (NNTP)" ), _ array( "!iisadmin", "IIS Admin Service" ), _ array( "!msexchangemgmt", "Microsoft Exchange Management" ), _ array( "!msexchangecoco", "Microsoft Exchange Connectivity Controller" ), _ array( "!lme-notes", "Microsoft Exchange Connector for Lotus Notes(R)" ), _ array( "!lme-gwise", "Microsoft Exchange Connector for Novell GroupWise" ), _ array( "!msexchangedx", "Microsoft Exchange Directory Synchronization" ), _ array( "!msexchangegwrtr", "Microsoft Exchange Router for Novell GroupWise" ), _ array( "!msexchangechat", "Microsoft Exchange Chat" ), _ array( "!msexchangeccmc", "Microsoft Exchange Connector for Lotus(R) cc;;Mail" ), _ array( "!msexchangemsmi", "MS Mail Connector Interchange" ), _ array( "!msexchangefb", "MS Schedule+ Free-Busy Connector" ) ) lstProcesses = array( "" ) lstPerfCounters = array( _ array( "Memory", "", "Available Bytes", ">104857600" ), _ array( "Processor", "_TOTAL", "% Processor Time", "<90" ) ) Case "5.5" lstServices = array( _ array( "msexchangeis", "Microsoft Exchange Information Store" ), _ array( "msexchangemta", "Microsoft Exchange MTA Stacks" ), _ array( "msexchangesa", "Microsoft Exchange System Attendant" ) ) lstProcesses = array( "" ) lstPerfCounters = array( _ array( "Memory", "", "Available Bytes", ">104857600" ), _ array( "Processor", "_TOTAL", "% Processor Time", "<90" ) ) Case Else SYSEXPLANATION = "Version [" + strVersion + "] is not supported." lstServices = array( array( "", "" ) ) lstProcesses = array( "" ) lstPerfCounters = array( array( "", "", "", "" ) ) getSoftwareInfo = False End Select End Function ' ////////////////////////////////////////////////////////////////////////////// Function checkServices( objWMIService, strHost, lstCheckServices, BYREF strExplanation ) Dim lstAllServices, arrCheckService checkServices = retvalUnknown ' Default return value strExplanation = "Unable to check for services on this machine" ' Get the services list If( Not retrieveServicesList( objWMIService, strHost, lstAllServices, strExplanation ) ) Then Exit Function End If ' Check services - only those that are not disabled by a leading '!' For Each arrCheckService in lstCheckServices If( arrCheckService( idxServiceShortname) <> "" And Left( arrCheckService( idxServiceShortname ), 1 ) <> "!" ) Then If( Not isServiceRunning( lstAllServices, arrCheckService(idxServiceShortname), arrCheckService(idxServiceLongname), strExplanation ) ) Then checkServices = False Exit Function End If End If Next checkServices = True strExplanation = "Services are running" End Function ' ////////////////////////////////////////////////////////////////////////////// Function checkProcesses( objWMIService, strHost, lstCheckProcesses, BYREF strExplanation ) Dim lstAllProcesses, strCheckProcess checkProcesses = retvalUnknown ' Default return value strExplanation = "Unable to check for processes on this machine" ' Get the processes list If( Not retrieveProcessesList( objWMIService, strHost, lstAllProcesses, strExplanation ) ) Then Exit Function End If ' Check processes - only those that are not disabled by a leading '!' For Each strCheckProcess in lstCheckProcesses If( strCheckProcess <> "" And Left( strCheckProcess, 1 ) <> "!" ) Then If( Not isProcessRunning( lstAllProcesses, strCheckProcess, strExplanation ) ) Then checkProcesses = False Exit Function End If End If Next checkProcesses = True strExplanation = "Processes are running" End Function ' ////////////////////////////////////////////////////////////////////////////// Function checkPerfCounters( strHost, strAltUserName, strAltPassword, lstCheckPerfCounters, BYREF strExplanation ) Dim objPerf, strPerfPath, numPerfValue Dim lstAllServices, arrCheckPerfCounter Dim strEval, bCompareResult checkPerfCounters = retvalUnknown ' Default return value strExplanation = "Unable to check for performance counters on this machine" ' Load the ActiveXperts Network Monitor Perfomance object Set objPerf = CreateObject( "ActiveXperts.NMPerf" ) ' Initialze Performance object. Optional parameter: a log file, for debugging purposes objPerf.Initialize( "" ) If( objPerf.LastError <> 0 ) Then checkPerfCounters = retvalUnknown SYSDATA = "" SYSEXPLANATION = "Failed to initialize performance object." Exit Function End If ' Connect. If strAltUserName is empty, the service credentials will be used objPerf.Connect strHost, strAltUserName, strAltPassword If( objPerf.LastError <> 0 ) Then checkPerfCounters = retvalUnknown SYSDATA = "" SYSEXPLANATION = "Failed to check performance counters (connect failed)." objPerf.Shutdown() Exit Function End If ' Check performance counters - only those that are not disabled by a leading '!' For Each arrCheckPerfCounter in lstCheckPerfCounters If( arrCheckPerfCounter( idxPerfObject ) <> "" And Left( arrCheckPerfCounter( idxPerfObject ), 1 ) <> "!" ) Then ' Build the Peformance path strPerfPath = objPerf.BuildPath( strHost, arrCheckPerfCounter(idxPerfObject), arrCheckPerfCounter(idxPerfContext), arrCheckPerfCounter(idxPerfItem) ) ' Get integer value. If floating point is expected, use GetDoubleValue instead numPerfValue = objPerf.GetIntegerValue( strPerfPath ) If( objPerf.LastError <> 0 ) Then checkPerfCounters = False SYSDATA = "" SYSEXPLANATION = "Performance Counter [" & strPerfPath & "] is not installed" Exit Function End If strEval = numPerfValue & " " & arrCheckPerfCounter(idxPerfCondition) bCompareResult = Eval( strEval ) If( Not bCompareResult ) Then checkPerfCounters = False SYSDATA = numPerfValue SYSEXPLANATION = "Performance Counter [" & strPerfPath & "], Condition[" & arrCheckPerfCounter(idxPerfItem) & arrCheckPerfCounter(idxPerfCondition) & "] failed, Current Value=[" & numPerfValue & "]" Exit Function End If End If Next objPerf.Shutdown() checkPerfCounters = True strExplanation = "Performance counters checked" End Function ' ////////////////////////////////////////////////////////////////////////////// Function retrieveServicesList( objWMIService, strHost, BYREF lstServices, BYREF strSysExplanation ) ' Retrieve the list of running services retrieveServicesList = False Set lstServices = Nothing On Error Resume Next Set lstServices = objWMIService.ExecQuery( "Select * from Win32_Service" ) If( Err.Number <> 0 ) Then strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]" Exit Function End If On Error Goto 0 If( lstServices.Count <= 0 ) Then strSysExplanation = "Win32_Service class does not exist on computer [" & strHost & "]" Exit Function End If retrieveServicesList = True End Function ' ////////////////////////////////////////////////////////////////////////////// Function retrieveProcessesList( objWMIService, strHost, BYREF lstProcesses, BYREF strSysExplanation ) ' Retrieve the list of running services retrieveProcessesList = False Set lstProcesses = Nothing On Error Resume Next Set lstProcesses = objWMIService.ExecQuery( "Select * from Win32_Process" ) If( Err.Number <> 0 ) Then strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]" Exit Function End If On Error Goto 0 If( lstProcesses.Count <= 0 ) Then strSysExplanation = "Win32_Process class does not exist on computer [" & strHost & "]" Exit Function End If retrieveProcessesList = True End Function ' ////////////////////////////////////////////////////////////////////////////// Function isServiceRunning( BYREF lstServices, strServiceName, strServiceDescription, BYREF strExplanation ) ' Check if a given service exists as running service in the services list Dim objService For Each objService in lstServices ' Check If this is the service we are looking for If( LCase( objService.Name ) = LCase( strServiceName ) ) Then If( objService.State = "Running" ) Then isServiceRunning = True Else strExplanation = "Service [" & strServiceDescription & "] service is not running" isServiceRunning = False End If Exit Function End If Next ' The service was not found, show an error message strExplanation = "Service [" & strServiceDescription & "] is not installed" isServiceRunning = False End Function ' ////////////////////////////////////////////////////////////////////////////// Function isProcessRunning( BYREF lstProcesses, strProcess, BYREF strExplanation ) ' Check if a given process exists as running process in the processes list Dim objProcess For Each objProcess in lstProcesses If( Err.Number <> 0 ) Then isProcessRunning = retvalUnknown strExplanation = "Unable to list processes" Exit Function End If ' Check If this is the service we are looking for If( LCase( objProcess.Name ) = LCase( strProcess ) ) Then isProcessRunning = True Exit Function End If Next ' The process was not found, show an error message strExplanation = "Process [" & strProcess & "] is not running" isProcessRunning = False End Function ' ////////////////////////////////////////////////////////////////////////////// Function getCredentials( strHost, strAltCredentials, BYREF strAltLogin, BYREF strAltPassword, BYREF strSysExplanation ) Dim objNMServerCredentials strAltLogin = "" strAltPassword = "" strSysExplanation = "" getCredentials = False If( strAltCredentials = "" ) Then ' No alternate credentials specified, so login and password are empty and service credentials will be used getCredentials = True Exit Function End If Set objNMServerCredentials = CreateObject( "ActiveXperts.NMServerCredentials" ) strAltLogin = objNMServerCredentials.GetLogin( strAltCredentials ) strAltPassword = objNMServerCredentials.GetPassword( strAltCredentials ) If( strAltLogin = "" ) Then getCredentials = False strSysExplanation = "No alternate credentials defined for [" & strAltCredentials & "]. In the Manager application, select 'Options' from the 'Tools' menu and select the 'Server Credentials' tab to enter alternate credentials" Exit Function End If getCredentials = True End Function ' ////////////////////////////////////////////////////////////////////////////// Function wmiConnect( strHost, strAltLogin, strAltPassword, BYREF objWMIService, BYREF strSysExplanation ) Dim objSWbemLocator, colItems Dim bConnectResult wmiConnect = False Set objWMIService = Nothing If( strAltLogin = "" ) Then ' Connect to remote host on same domain using same security context On Error Resume Next Set objWMIService = GetObject( "winmgmts:{impersonationLevel=Impersonate}!\\" & strHost &"\root\cimv2" ) If( Err.Number <> 0 ) Then bConnectResult = False Else bConnectResult = True End If On Error Goto 0 Else ' Connect to remote host using different security context and/or different domain On Error Resume Next Set objSWbemLocator = CreateObject( "WbemScripting.SWbemLocator" ) Set objWMIService = objSWbemLocator.ConnectServer( strHost, "root\cimv2", strAltLogin, strAltPassword ) If( Err.Number <> 0 ) Then bConnectResult = False Else bConnectResult = True End If objWMIService.Security_.ImpersonationLevel = 3 On Error Goto 0 End If If( Not bConnectResult ) Then Set objWMIService = Nothing wmiConnect = False strSysExplanation = "Unable to connect to [" & strHost & "]. Possible reasons: no WMI installed on the remote server, firewall blocking WMI calls, login failure, or remote server down" Exit Function End If wmiConnect = True End Function