Monitoring printers and services (VBScript)
- Details
- Category: Scripts and Code
- Published on Monday, 07 November 2011 15:19
- Written by Christian Dunn
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,strPrintQuerystrPrintQuery2="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,strPrintQuery2strPrintQuery3="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,strPrintQuery3strServiceQuery="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 SubSub 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 IfIf objFSO.FileExists(strDirectory & strFile) Then
Set objFolder = objFSO.GetFolder(strDirectory)
Else
Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
'Wscript.Echo "Just created " & strDirectory & strFile
End Ifset objFile = nothing
on error resume next
set objFolder = nothing
' OpenTextFile Method needs a Const value
' ForAppending = 8 ForReading = 1, ForWriting = 2
Const ForAppending = 8Set objTextFile = objFSO.OpenTextFile _
(strDirectory & strFile, ForAppending, True)' Writes strText every time you run this VBScript
objTextFile.WriteLine(strText)
objTextFile.Close
End Sub