Monitoring printers and services (VBScript)

AddThis Social Bookmark Button

The following script logs printer and service activity on a server.

This script is designed to identify the cause of printer issues by recording changes in the spool service or print job classes.

Simply copy and paste the code into a text file and rename it to printers.vbs.
Run this script by double clicking on it.
A new folder called 'printlog' will be created and changes to print jobs or services will be logged in this folder in a file called log.txt.

strComputer="."

strPrintQuery="Select * from __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PrintJob'"
Set PRINTSink=WScript.CreateObject("WBemScripting.SWbemSink","PRINTNEW_")
Set objWMI = GetObject("WinMgmts:{impersonationLevel=impersonate, (security)}!\\" & strComputer & "\")
objWMI.ExecNotificationQueryAsync PRINTSink,strPrintQuery

strPrintQuery2="Select * from __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PrintJob'"
Set PRINTSink2=WScript.CreateObject("WBemScripting.SWbemSink","PRINTDEL_")
Set objWMI2 = GetObject("WinMgmts:{impersonationLevel=impersonate, (security)}!\\" & strComputer & "\")
objWMI2.ExecNotificationQueryAsync PRINTSink2,strPrintQuery2

strPrintQuery3="Select * from __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PrintJob'"
Set PRINTSink3=WScript.CreateObject("WBemScripting.SWbemSink","PRINTMOD_")
Set objWMI3 = GetObject("WinMgmts:{impersonationLevel=impersonate, (security)}!\\" & strComputer & "\")
objWMI3.ExecNotificationQueryAsync PRINTSink3,strPrintQuery3

strServiceQuery="Select * from __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Service'"
Set SERVICESink=WScript.CreateObject("WBemScripting.SWbemSink","SERVICEMOD_")
Set objWMI4 = GetObject("WinMgmts:{impersonationLevel=impersonate, (security)}!\\" & strComputer & "\")
objWMI4.ExecNotificationQueryAsync SERVICESink,strServiceQuery


WriteFile NOW & " Connected to Server - Started Data Capture"

While (True)
     WScript.Sleep (500)
Wend


Sub PRINTNEW_OnObjectReady(objEvent,objContext)
 WriteFile NOW & " New Job: " & objEvent.TargetInstance.HostPrintQueue & "\" & objEvent.TargetInstance.DriverName & " | " & objEvent.TargetInstance.Owner & " | " & objEvent.TargetInstance.Name & " | " & objEvent.TargetInstance.Document
End Sub
Sub PRINTDEL_OnObjectReady(objEvent,objContext)
 WriteFile NOW & " Deleted Job: " & objEvent.TargetInstance.HostPrintQueue & "\" & objEvent.TargetInstance.DriverName & " | " & objEvent.TargetInstance.Owner & " | " & objEvent.TargetInstance.Name & " | " & objEvent.TargetInstance.Document
End Sub
Sub PRINTMOD_OnObjectReady(objEvent,objContext)
 WriteFile NOW & " Modified Job: " & objEvent.TargetInstance.HostPrintQueue & "\" & objEvent.TargetInstance.DriverName & " | " & objEvent.TargetInstance.Owner & " | " & objEvent.TargetInstance.Name & " | " & objEvent.TargetInstance.Document
End Sub
Sub SERVICEMOD_OnObjectReady(objEvent,objContext)
 WriteFile NOW & " Modified Service: " & objEvent.TargetInstance.Name & " | Status: " & objEvent.TargetInstance.Status & " | Started: " & objEvent.TargetInstance.Started & " | Exit Code: " & objEvent.TargetInstance.ExitCode
End Sub

Sub WriteFile(strText)
Dim objFSO, objFolder, objShell, objTextFile, objFile
Dim strDirectory, strFile
strDirectory = "printlog"
strFile = "\log.txt"

' Create the File System Object
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Check that the strDirectory folder exists
If objFSO.FolderExists(strDirectory) Then
   Set objFolder = objFSO.GetFolder(strDirectory)
Else
   Set objFolder = objFSO.CreateFolder(strDirectory)
   'WScript.Echo "Just created " & strDirectory
End If

If objFSO.FileExists(strDirectory & strFile) Then
   Set objFolder = objFSO.GetFolder(strDirectory)
Else
   Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
   'Wscript.Echo "Just created " & strDirectory & strFile
End If

set objFile = nothing
on error resume next
set objFolder = nothing
' OpenTextFile Method needs a Const value
' ForAppending = 8 ForReading = 1, ForWriting = 2
Const ForAppending = 8

Set objTextFile = objFSO.OpenTextFile _
(strDirectory & strFile, ForAppending, True)

' Writes strText every time you run this VBScript
objTextFile.WriteLine(strText)
objTextFile.Close
End Sub