process.vbs - vbscript script by ActiveXperts Software
process.vbs checks whether a process is running. Checks CPU and memory resources as well.
Use process.vbs directly from ActiveXperts Network Monitor; in the Manager's 'Monitor' menu, select 'New Check (Script)' and select process.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.
process.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)
' // 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 = CheckProcessMemory( "localhost", "", "explorer.exe", 2000 )
' WScript.Echo "Return value: [" & bResult & "]"
' WScript.Echo "SYSDATA: [" & SYSDATA & "]"
' WScript.Echo "SYSEXPLANATION: [" & SYSEXPLANATION & "]"
' The following contants are use in process/memory checks.
' By default, the Private Working Set is used (which is also the default in the Windows Task Manager).
' Change the idxMemPrivateWorkingSet parameter in the code below to monitor a different type of process memory
Const idxMemPrivateWorkingSet = 0 ' Task Manager [Private Working Set] (default)
Const idxMemCommitSize = 1 ' Task Manager [Commit Size] (default)
Const idxMemWorkingSet = 2 ' Task Manager [Working Set]
Const idxMemPeakWorkingSet = 3 ' Task Manager [Peak Working Set]
Const idxMemPrivatePagedPool = 4 ' Task Manager [Memory - Paged Pool]
Const idxMemNonPagedPool = 5 ' Task Manager [Non-Paged Pool]
Function CheckProcess( strHost, strAltCredentials, strProcess )
' Description:
' Checks if a process, specified by strProcess, is running on the machine specified by strHost.
' Parameters:
' 1) strHost As String - Hostname or IP address of the computer 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) strProcess As String - Name of the process
' Usage:
' CheckProcess( "<Hostname | IP>", "<Empty String | Server>", "<Process>" )
' Sample:
' CheckProcess( "localhost", "", "explorer.exe" )
Dim strAltLogin, strAltPassword, objWMIService
CheckProcess = 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 = ""
' 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
CheckProcess = checkProcessWMI( objWMIService, strHost, strProcess, SYSEXPLANATION )
End Function
' //////////////////////////////////////////////////////////////////////////////
Function CheckProcessMemory( strHost, strAltCredentials, strProcessName, nMaxMB )
' Description:
' This function checks if a process, specified by strProcess, is consuming less than nMaxMB of memory on computer specified by strHost.
' Parameters:
' 1) strHost As String - Hostname or IP address of the computer 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) strProcessName As String - Name of the process
' 4) nMaxMB As Number - Maximum allowed memory usage (MB)
' Usage:
' CheckProcessMemory( "<Hostname | IP>", "<Empty String | Server>", "<Process>", Max_MB )
' Sample:
' CheckProcessMemory( "localhost", "", "axnmsvc.exe", 30 )
Dim strAltLogin, strAltPassword, objWMIService
CheckProcessMemory = 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 = ""
' 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
CheckProcessMemory = checkProcessMemoryWMI( objWMIService, strHost, strProcessName, idxMemPrivateWorkingSet, nMaxMB, SYSDATA, SYSEXPLANATION )
End Function
' //////////////////////////////////////////////////////////////////////////////
Function CheckProcessHandles( strHost, strAltCredentials, strProcessName, nMaxHandles )
' Description:
' This function checks if a process, specified by strProcess, is holding less than nMaxHandles of handles on computer specified by strHost.
' Parameters:
' 1) strHost As String - Hostname or IP address of the computer 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) strProcessName As String - Name of the process
' 4) nMaxHandles As Number - Maximum allowed number of Handles )
' Usage:
' CheckProcessHandles( "<Hostname | IP>", "<Empty String | Server>", "<Process>", Max_MB )
' Sample:
' CheckProcessHandles( "localhost", "", "axnmsvc.exe", 300 )
Dim strAltLogin, strAltPassword, objWMIService
CheckProcessHandles = 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 = ""
' 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
CheckProcessHandles = checkProcessHandlesWMI( objWMIService, strHost, strProcessName, nMaxHandles, SYSDATA, SYSEXPLANATION )
End Function
' //////////////////////////////////////////////////////////////////////////////
Function CheckAnyProcessMemory( strHost, strAltCredentials, nMaxMB )
' Description:
' This function checks if any process, is consuming more than nMaxMB of memory on computer specified by strHost.
' Parameters:
' 1) strHost As String - Hostname or IP address of the computer 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) nMaxMB As Number - Maximum allowed memory usage (MB)
' Usage:
' CheckAnyProcessMemory( "<Hostname | IP>", "<Empty String | Server>", Max_MB )
' Sample:
' CheckAnyProcessMemory( "localhost", "", 100 )
Dim strAltLogin, strAltPassword, objWMIService
CheckAnyProcessMemory = 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 = ""
' 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
CheckAnyProcessMemory = checkAnyProcessMemoryWMI( objWMIService, strHost, idxMemPrivateWorkingSet, nMaxMB, SYSDATA, SYSEXPLANATION )
End Function
' //////////////////////////////////////////////////////////////////////////////
Function CheckProcessCpu( strHost, strAltCredentials, strProcess, numMaxCPU )
' Description:
' This function checks if a process doesn't consume more than the maximum specified CPU usage (%)
' Parameters:
' 1) strHost As String - Hostname or IP address of the computer 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) strProcess As String - Name of the process
' 4) numMaxCPU As Number - Maximum CPU usage (in %)
' Usage:
' CheckProcessCpu( "<Hostname | IP>", "<Empty String | Server>", "<Process>", Max_CPU)
' Sample:
' CheckProcessCpu( "localhost", "", "explorer.exe", 10 )
Dim strAltLogin, strAltPassword, objWMIService
CheckProcessCpu = 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 = ""
' 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
CheckProcessCpu = checkProcessCpuWMI( objWMIService, strHost, strProcess, numMaxCPU, SYSDATA, SYSEXPLANATION )
End Function
' //////////////////////////////////////////////////////////////////////////////
Function CheckNumProcesses( strHost, strAltCredentials, strProcess, numMinInstances, numMaxInstances )
' Description:
' This function counts the number processes - indicated by strProcess -on the computer specified by strHost.
' If this count is less than numMinInstances or greater than numMaxInstances, an eror is generated.
' Parameters:
' 1) strHost As String - Hostname or IP address of the computer 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) strProcess As String - Name of the process
' 4) numMinInstances - minimum number of instances
' 5) numMaxInstances - maximum number of instances
' Usage:
' CheckNumProcesses( "<Hostname | IP>", "<Empty String | Server>", "<Process>", Min_Instances, Max_Instances )
' Sample:
' CheckNumProcesses( "localhost", "", "svchost.exe", 1, 5 )
Dim strAltLogin, strAltPassword, objWMIService
CheckNumProcesses = 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 = ""
' 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
CheckNumProcesses = checkNumProcessesWMI( objWMIService, strHost, strProcess, numMinInstances, numMaxInstances, SYSDATA, SYSEXPLANATION )
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 checkProcessWMI( objWMIService, strHost, strProcess, BYREF strSysExplanation )
Dim objProcess, collProcesses
checkProcessWMI = retvalUnknown ' Default return value
On Error Resume Next
set collProcesses = objWMIService.ExecQuery( "select * from Win32_Process" )
If( Err.Number <> 0 ) Then
strSysData = ""
strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]"
Exit Function
End If
If( collProcesses.Count <= 0 ) Then
strSysData = ""
strSysExplanation = "Win32_Process class does not exist on computer [" & strHost & "]"
Exit Function
End If
On Error Goto 0
For Each objProcess in collProcesses
If( Err.Number <> 0 ) Then
checkProcessWMI = retvalUnknown
strSysExplanation = "Unable to list processes on computer [" & strHost & "]"
Exit Function
End If
If UCase( objProcess.Name ) = UCase( strProcess ) Then
checkProcessWMI = True
strSysExplanation = "Process [" & strProcess & "] is running on computer [" & strHost & "]"
Exit Function
End If
Next
checkProcessWMI = False
strSysExplanation = "Process [" & strProcess & "] is not running on computer [" & strHost & "]"
End Function
' //////////////////////////////////////////////////////////////////////////////
Function checkProcessHandlesWMI( objWMIService, strHost, strProcessName, nMaxHandles, BYREF strSysData, BYREF strSysExplanation )
Dim objProcess, colProcesses, nUsageHandles, nHighUsageHandles, nDiffHandles, bProcessFound, strProcessNameShort
checkProcessHandlesWMI = retvalUnknown ' Default return value
bProcessFound = False
nUsageHandles = 0
nHighUsageHandles = 0
On Error Resume Next
Set colProcesses = objWMIService.ExecQuery( "Select * from Win32_PerfRawData_PerfProc_Process" )
If( Err.Number <> 0 ) Then
strSysData = ""
strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]"
Exit Function
End If
If( colProcesses.Count <= 0 ) Then
strSysData = ""
strSysExplanation = "Win32_PerfRawData_PerfProc_Process class does not exist on computer [" & strHost & "]"
Exit Function
End If
On Error Goto 0
' Win32_PerfRawData_PerfProc_Process lists processes without .exe, e.g. explorer instead of explorer.exe.
strProcessNameShort = Replace( strProcessName, ".exe", "" )
For Each objProcess in colProcesses
If( Err.Number <> 0 ) Then
checkProcessHandlesWMI = retvalUnknown
strSysExplanation = "Unable to list processes on computer [" & strHost & "]"
Exit Function
End If
If UCase( objProcess.Name )= UCase( strProcessName ) Or UCase( objProcess.Name ) = UCase( strProcessNameShort ) Then
bProcessFound = True
nUsageHandles = CInt( objProcess.HandleCount )
If( nUsageHandles > nHighUsageHandles ) Then
nHighUsageHandles = nUsageHandles
End If
End If
Next
If( bProcessFound ) Then
nDiffHandles = nMaxHandles - nHighUsageHandles
strSysData = nHighUsageHandles
strSysExplanation = "Handle Count=[" & nHighUsageHandles & "], maximum allowed=[" & nMaxHandles & "]"
If nDiffHandles >= 0 then
checkProcessHandlesWMI = True
Else
checkProcessHandlesWMI = False
End if
Else
checkProcessHandlesWMI = retvalUnknown
strSysExplanation = "Process [" & strProcessName & "] is not running on computer [" & strHost & "]"
End If
End Function
' //////////////////////////////////////////////////////////////////////////////
Function checkProcessMemoryWMI( objWMIService, strHost, strProcessName, nMemCheckType, nMaxMB, BYREF strSysData, BYREF strSysExplanation )
Dim objProcess, colProcesses, nUsageMB, nHighUsageMB, nDiff, bProcessFound, strProcessNameShort
checkProcessMemoryWMI = retvalUnknown ' Default return value
bProcessFound = False
nUsageMB = 0
nHighUsageMB = 0
On Error Resume Next
Set colProcesses = objWMIService.ExecQuery( "Select * from Win32_PerfRawData_PerfProc_Process" )
If( Err.Number <> 0 ) Then
strSysData = ""
strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]"
Exit Function
End If
If( colProcesses.Count <= 0 ) Then
strSysData = ""
strSysExplanation = "Win32_PerfRawData_PerfProc_Process class does not exist on computer [" & strHost & "]"
Exit Function
End If
On Error Goto 0
' Win32_PerfRawData_PerfProc_Process lists processes without .exe, e.g. explorer instead of explorer.exe.
strProcessNameShort = Replace( strProcessName, ".exe", "" )
For Each objProcess in colProcesses
If( Err.Number <> 0 ) Then
checkProcessMemoryWMI = retvalUnknown
strSysExplanation = "Unable to list processes on computer [" & strHost & "]"
Exit Function
End If
If UCase( objProcess.Name )= UCase( strProcessName ) Or UCase( objProcess.Name ) = UCase( strProcessNameShort ) Then
bProcessFound = True
' idxMemPrivateWorkingSet, Task Manager [Private Working Set] -> objProcess.WorkingSetPrivate
' idxMemCommitSize, Task Manager [Commit Size] -> objProcess.PrivateBytes
' idxMemWorkingSet, Task Manager [Working Set] -> objProcess.WorkingSet
' idxMemPeakWorkingSet, Task Manager [Peak Working Set] -> objProcess.WorkingSetPeak
' idxMemPrivatePagedPool, Task Manager [Memory - Paged Pool] -> objProcess.PoolPagedBytes
' idxMemNonPagedPool, Task Manager [Non-Paged Pool] -> objProcess.PoolNonpagedBytes
Select Case nMemCheckType
Case idxMemPrivateWorkingSet
nUsageMB = CInt( objProcess.WorkingSetPrivate / ( 1024 * 1024 ) )
Case idxMemCommitSize
nUsageMB = CInt( objProcess.PrivateBytes / ( 1024 * 1024 ) )
Case idxMemWorkingSet
nUsageMB = CInt( objProcess.WorkingSet / ( 1024 * 1024 ) )
Case idxMemPeakWorkingSet
nUsageMB = CInt( objProcess.WorkingSetPeak / ( 1024 * 1024 ) )
Case idxMemPrivatePagedPool
nUsageMB = CInt( objProcess.PoolPagedBytes / ( 1024 * 1024 ) )
Case idxMemNonPagedPool
nUsageMB = CInt( objProcess.PoolNonpagedBytes / ( 1024 * 1024 ) )
Case Else
nUsageMB = CInt( objProcess.PrivateBytes / ( 1024 * 1024 ) )
End Select
If( nUsageMB > nHighUsageMB ) Then
nHighUsageMB = nUsageMB
End If
End If
Next
If( bProcessFound ) Then
nDiff = nMaxMB - nHighUsageMB
strSysData = nHighUsageMB
strSysExplanation = "Memory usage=[" & nHighUsageMB & "MB], maximum allowed=[" & nMaxMB & " MB]"
If nDiff >= 0 then
checkProcessMemoryWMI = True
Else
checkProcessMemoryWMI = False
End if
Else
checkProcessMemoryWMI = retvalUnknown
strSysExplanation = "Process [" & strProcessName & "] is not running on computer [" & strHost & "]"
End If
End Function
' //////////////////////////////////////////////////////////////////////////////
Function checkAnyProcessMemoryWMI( objWMIService, strHost, nMemCheckType, nMaxMB, BYREF strSysData, BYREF strSysExplanation )
Dim objProcess, colProcesses, nUsedMB, nDiffMB
checkAnyProcessMemoryWMI = retvalUnknown ' Default return value
On Error Resume Next
Set colProcesses = objWMIService.ExecQuery( "Select * from Win32_PerfRawData_PerfProc_Process" )
If( Err.Number <> 0 ) Then
strSysData = ""
strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]"
Exit Function
End If
If( colProcesses.Count <= 0 ) Then
strSysData = ""
strSysExplanation = "Win32_PerfRawData_PerfProc_Process class does not exist on computer [" & strHost & "]"
Exit Function
End If
On Error Goto 0
For Each objProcess in colProcesses
If( Err.Number <> 0 ) Then
checkAnyProcessMemoryWMI = retvalUnknown
strSysExplanation = "Unable to list processes on computer [" & strHost & "]"
Exit Function
End If
' idxMemPrivateWorkingSet, Task Manager [Private Working Set] -> objProcess.WorkingSetPrivate
' idxMemCommitSize, Task Manager [Commit Size] -> objProcess.PrivateBytes
' idxMemWorkingSet, Task Manager [Working Set] -> objProcess.WorkingSet
' idxMemPeakWorkingSet, Task Manager [Peak Working Set] -> objProcess.WorkingSetPeak
' idxMemPrivatePagedPool, Task Manager [Memory - Paged Pool] -> objProcess.PoolPagedBytes
' idxMemNonPagedPool, Task Manager [Non-Paged Pool] -> objProcess.PoolNonpagedBytes
Select Case nMemCheckType
Case idxMemPrivateWorkingSet
nUsedMB = CInt( objProcess.WorkingSetPrivate / ( 1024 * 1024 ) )
Case idxMemCommitSize
nUsedMB = CInt( objProcess.PrivateBytes / ( 1024 * 1024 ) )
Case idxMemWorkingSet
nUsedMB = CInt( objProcess.WorkingSet / ( 1024 * 1024 ) )
Case idxMemPeakWorkingSet
nUsedMB = CInt( objProcess.WorkingSetPeak / ( 1024 * 1024 ) )
Case idxMemPrivatePagedPool
nUsedMB = CInt( objProcess.PoolPagedBytes / ( 1024 * 1024 ) )
Case idxMemNonPagedPool
nUsedMB = CInt( objProcess.PoolNonpagedBytes / ( 1024 * 1024 ) )
Case Else
nUsedMB = CInt( objProcess.PrivateBytes / ( 1024 * 1024 ) )
End Select
nDiffMB = nMaxMB - nUsedMB
If nDiffMB < 0 then
strSysData = nUsedMB
strSysExplanation = "Memory usage of process [" & objProcess.Name & "] is [" & nUsedMB & "MB], maximum allowed=[" & nMaxMB & " MB]"
checkAnyProcessMemoryWMI = False
Exit Function
End If
Next
strSysData = ""
strSysExplanation = "No process uses more than [" & nMaxMB & " MB]"
checkAnyProcessMemoryWMI = True
End Function
' //////////////////////////////////////////////////////////////////////////////
Function checkProcessCpuWMI( objWMIService, strHost, strProcess, numMaxCpuUsage, BYREF strSysData, BYREF strSysExplanation )
Dim N1, D1, N2, D2, numLogicalCpus, numCpuUsage
Dim objProcess, objVbUtils, objInstance1, objInstance2
Dim strQuery, strProcessEx, strObjectPath
checkProcessCpuWMI = retvalUnknown ' Default return value
numLogicalCpus = getNumLogicalProcessorsWMI( objWMIService, strHost, strSysExplanation )
If( numLogicalCpus <= 0 ) Then
checkProcessCpuWMI = retvalUnknown
' strSysExplanation already set in getNumLogicalProcessorsWMI
Exit Function
End If
strProcessEx = Replace( UCase( strProcess ), ".EXE", "" ) ' Cutt off ".exe" is necessary
strObjectPath = "Win32_PerfRawData_PerfProc_Process.Name=" & chr(34) & strProcessEx & chr(34)
Set objVbUtils = CreateObject( "ActiveXperts.VbUtilities" )
On Error Resume Next
Set objInstance1 = objWMIService.get( strObjectPath )
N1 = objInstance1.PercentProcessorTime
D1 = objInstance1.TimeStamp_Sys100NS
On Error Goto 0
If( N1 = 0 OR D1 = 0 ) Then
checkProcessCpuWMI = retvalUnknown
strSysExplanation = "Process [" & strProcess & "] not running on computer [" & strHost & "]"
Exit Function
End If
objVbUtils.Sleep( 1000 )
On Error Resume Next
Set objInstance2 = objWMIService.get( strObjectPath )
N2 = objInstance2.PercentProcessorTime
D2 = objInstance2.TimeStamp_Sys100NS
On Error Goto 0
If( N1 = 0 OR D1 = 0 ) Then
checkProcessCpuWMI = retvalUnknown
strSysExplanation = "Process [" & strProcess & "] not running on computer [" & strHost & "]"
Exit Function
End If
If( ( D2 - D1 ) = 0 ) Then
checkProcessCpuWMI = True
strSysData = "0"
strSysExplanation = "CPU usage of process [" & strProcess & "] = [0%]"
Exit Function
End If
numCpuUsage = CInt( (((N2 - N1) / (D2 - D1)) * 100)/numLogicalCpus )
strSysData = numCpuUsage
strSysExplanation = "CPU usage of process [" & strProcess & "] = [" & strSysData & "%]"
If( numCpuUsage > numMaxCpuUsage ) Then
checkProcessCpuWMI = False
Else
checkProcessCpuWMI = True
End If
End Function
' //////////////////////////////////////////////////////////////////////////////
Function checkNumProcessesWMI( objWMIService, strHost, strProcess, numMinInstances, numMaxInstances, BYREF strSysData, BYREF strSysExplanation )
Dim objProcess, collProcesses, numProcesses
checkNumProcessesWMI = retvalUnknown ' Default return value
numProcesses = 0
On Error Resume Next
set collProcesses = objWMIService.ExecQuery( "Select * from Win32_Process" )
If( Err.Number <> 0 ) Then
strSysData = ""
strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]"
Exit Function
End If
If( collProcesses.Count <= 0 ) Then
strSysData = ""
strSysExplanation = "Win32_Process class does not exist on computer [" & strHost & "]"
Exit Function
End If
On Error Goto 0
For Each objProcess in collProcesses
If( Err.Number <> 0 ) Then
checkNumProcessesWMI = retvalUnknown
strSysExplanation = "Unable to list processes on computer [" & strHost & "]"
Exit Function
End If
If UCase( objProcess.Name ) = UCase( strProcess ) Then
numProcesses = numProcesses + 1
End If
Next
strSysData = numProcesses
strSysExplanation = numProcesses & " number of instances of process [" & strProcess & "] running on computer [" & strHost & "]"
If( numProcesses < numMinInstances OR numProcesses > numMaxInstances ) Then
checkNumProcessesWMI = False
Exit Function
End If
checkNumProcessesWMI = True
End Function
' //////////////////////////////////////////////////////////////////////////////
Function getNumLogicalProcessorsWMI( objWMIService, strHost, BYREF strSysExplanation )
Dim objProcessor, colProcessors, numLogicalProcessors
getNumLogicalProcessorsWMI = 0
numLogicalProcessors = 0
On Error Resume Next
set colProcessors = objWMIService.ExecQuery( "Select * from Win32_Processor" )
If( Err.Number <> 0 ) Then
strSysExplanation = "Unable to query WMI class on computer [" & strHost & "]"
Exit Function
End If
If( colProcessors.Count <= 0 ) Then
strSysExplanation = "Win32_Processor class does not exist on computer [" & strHost & "]"
Exit Function
End If
On Error Goto 0
For Each objProcessor In colProcessors
numLogicalProcessors = numLogicalProcessors + objProcessor.NumberOfLogicalProcessors
Next
getNumLogicalProcessorsWMI = numLogicalProcessors
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 = "Failed to connect to '" & strHost & "'. Possible reasons: Login failure, no WMI installed on the remote server, firewall blocking WMI calls, or remote server down"
Exit Function
End If
wmiConnect = True
End Function
