' ///////////////////////////////////////////////////////////////////////////////
' // ActiveXperts Network Monitor  - VBScript based checks
' // © ActiveXperts Software B.V.
' //
' // For more information about ActiveXperts Network Monitor and VBScript, please
' // visit the online ActiveXperts Network Monitor VBScript Guidelines at:
' //    http://www.activexperts.com/support/network-monitor/online/vbscript/
' // 
' ///////////////////////////////////////////////////////////////////////////////  

Option Explicit
Const  retvalUnknown = 1
Dim    SYSDATA, SYSEXPLANATION  ' Used by Network Monitor, don't change the names

' ///////////////////////////////////////////////////////////////////////////////
' // To test a function outside Network Monitor (e.g. using CSCRIPT from the
' // command line), remove the comment character (') in the following 5 lines:
' Dim bResult
' bResult =  CheckPrinter( "localhost", "", "HP LaserJet 2300 Series PS" )
' WScript.Echo "Return value: [" & bResult & "]"
' WScript.Echo "SYSDATA: [" & SYSDATA & "]"
' WScript.Echo "SYSEXPLANATION: [" & SYSEXPLANATION & "]"
' //////////////////////////////////////////////////////////////////////////////

Const PrinterIdle       = 3
Const PrinterPrinting   = 4
Const PrinterWarmingUp  = 5

Function CheckPrinter( strHost, strCredentials, strPrinter )

' Description: 
'     This function checks if the printer, indicated by strPrinter, is up and running on  
'       the machine specified by strHost.
' Parameters:
'     1) strHost As String - Hostname or IP address of the computer you want to check
'     2) strCredentials 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) strPrinter  As String - Name of the printer
' Usage:
'     CheckPrinter( "<Hostname | IP>", "<Empty String | Server>", "<Printername>" )
' Sample:
'     CheckPrinter( "localhost", "", "HP LaserJet 2300 Series PS" )

    Dim objWMIService

    CheckPrinter      = retvalUnknown  ' Default return value
    SYSDATA           = ""             ' SysData will store the printer status after completion
    SYSEXPLANATION    = ""             ' Set initial value

    If( Not getWMIObject( strHost, strCredentials, objWMIService, SYSEXPLANATION ) ) Then
        Exit Function
    End If

    CheckPrinter      = checkPrinterWMI( objWMIService, strHost, strPrinter, SYSDATA, SYSEXPLANATION )

End Function



' //////////////////////////////////////////////////////////////////////////////
' //
' // Private Functions
' //   NOTE: Private functions are used by the above functions, and will not
' //         be called directly by the ActiveXperts Network Monitor Service.
' //         Private function names start with a lower case character and will
' //         not be listed in the Network Monitor's function browser.
' //
' //////////////////////////////////////////////////////////////////////////////

Function checkPrinterWMI( objWMIService, strHost, strPrinter, BYREF strSysData, BYREF strSysExplanation )

    Dim objPrinter, collPrinters

    checkPrinterWMI                = retvalUnknown  ' Default return value

On Error Resume Next

    set collPrinters = objWMIService.ExecQuery( "select * from Win32_Printer" ) 
    If( Err.Number <> 0 ) Then
        strSysData         = ""
        strSysExplanation  = "Unable to query WMI on computer [" & strHost & "]"
        Exit Function
    End If
    If( collPrinters.Count <= 0  ) Then
        strSysData         = ""
        strSysExplanation  = "Win32_Printer class does not exist on computer [" & strHost & "]"
        Exit Function
    End If

On Error Goto 0

    If( collPrinters.Count = 0 ) Then
        checkPrinterWMI            = retvalUnknown
        strSysData                 = ""
        strSysExplanation          = "No printers found on print server"
        Exit Function			    
    End If

    For each objPrinter in collPrinters  
        If( Err.Number <> 0 ) Then
            checkPrinterWMI        = retvalUnknown
            strSysData             = ""
            strSysExplanation      = "No printers found on print server"
            Exit Function
        End If

        If UCase( objPrinter.Name ) = UCase( strPrinter  ) Then
           If objPrinter.PrinterStatus = PrinterIdle Or objPrinter.PrinterStatus = PrinterPrinting Or objPrinter.PrinterStatus = PrinterWarmingUp Then
                checkPrinterWMI    = True
                strSysData         = objPrinter.PrinterStatus & "," & getPrinterStatusInfo( objPrinter.PrinterStatus )
                strSysExplanation  = "Printer is up (" & getPrinterStatusInfo( objPrinter.PrinterStatus ) & ")"
                Exit Function
           End If

           checkPrinterWMI         = False
           strSysData              = objPrinter.PrinterStatus & "," & getPrinterStatusInfo( objPrinter.PrinterStatus )
           strSysExplanation       = "Printer is down (" & getPrinterStatusInfo( objPrinter.PrinterStatus ) & ")"
           Exit Function
        End If 
    Next

    checkPrinterWMI                = False
    strSysExplanation              = "Printer [" & strPrinter &"] not found on print server [" & strHost & "]"

End Function

' //////////////////////////////////////////////////////////////////////////////

Function getWMIObject( strHost, strCredentials, BYREF objWMIService, BYREF strSysExplanation )	

On Error Resume Next

    Dim objNMServerCredentials, objSWbemLocator, colItems
    Dim strUsername, strPassword

    getWMIObject              = False

    Set objWMIService         = Nothing
    
    If( strCredentials = "" ) Then	
        ' Connect to remote host on same domain using same security context
        Set objWMIService     = GetObject( "winmgmts:{impersonationLevel=Impersonate}!\\" & strHost &"\root\cimv2" )
    Else
        Set objNMServerCredentials = CreateObject( "ActiveXperts.NMServerCredentials" )

        strUsername           = objNMServerCredentials.GetLogin( strCredentials )
        strPassword           = objNMServerCredentials.GetPassword( strCredentials )

        If( strUsername = "" ) Then
            getWMIObject      = False
            strSysExplanation = "No alternate credentials defined for [" & strCredentials & "]. In the Manager application, select 'Options' from the 'Tools' menu and select the 'Server Credentials' tab to enter alternate credentials"
            Exit Function
        End If
	
        ' Connect to remote host using different security context and/or different domain 
        Set objSWbemLocator   = CreateObject( "WbemScripting.SWbemLocator" )
        Set objWMIService     = objSWbemLocator.ConnectServer( strHost, "root\cimv2", strUsername, strPassword )

        If( Err.Number <> 0 ) Then
            objWMIService     = Nothing
            getWMIObject      = False
            strSysExplanation = "Unable to access [" & strHost & "]. Possible reasons: WMI not running on the remote server, Windows firewall is blocking WMI calls, insufficient rights, or remote server down"
            Exit Function
        End If

        objWMIService.Security_.ImpersonationLevel = 3
    End If
	
    If( Err.Number <> 0 ) Then
        objWMIService         = Nothing
        getWMIObject          = False
        strSysExplanation     = "Unable to access '" & strHost & "'. Possible reasons: no WMI installed on the remote server, no rights to access remote WMI service, or remote server down"
        Exit Function
    End If    

    getWMIObject              = True 

End Function

' //////////////////////////////////////////////////////////////////////////////

Function getPrinterStatusInfo( numStatus )

Dim strStatusInfo

    getPrinterStatusInfo = ""

    Select Case numStatus 
       Case  1 
          strStatusInfo = "Other" 
       Case  2
          strStatusInfo = "Unknown" 
       Case  3
          strStatusInfo = "Running/Full Power" 
       Case  4
          strStatusInfo = "Warning" 
       Case  5
          strStatusInfo = "In Test" 
       Case  6
          strStatusInfo = "Not Applicable" 
       Case  7
          strStatusInfo = "Power Off" 
       Case  8
          strStatusInfo = "Off Line" 
       Case  9
          strStatusInfo = "Off Duty" 
       Case 10
          strStatusInfo = "Degraded" 
       Case 11
          strStatusInfo = "Not Installed" 
       Case 12
          strStatusInfo = "Install Error" 
       Case 13
          strStatusInfo = "Power Save - Unknown" 
       Case 14
          strStatusInfo = "Power Save - Low Power Mode" 
       Case 15
          strStatusInfo = "Power Save - Standby" 
       Case 16
          strStatusInfo = "Power Cycle" 
       Case 17
          strStatusInfo = "Power Save - Warning" 
       Case Else
          strStatusInfo = "Unkown" 
    End Select 

    getPrinterStatusInfo = strStatusInfo 

End Function	


