I've been searching for a way to aggregate the printers websites in order to create a solution but that didn't work so I wondered if I could pull information via a "public" SNMP connection using PowerShell. After many online searches, I found someone calling on the ComObject ole.Prn.OleSNMP.
$SNMP = new-object -ComObject olePrn.OleSNMP
The SNMP object has a slight variation of the standard SNMP syntax. The GetTree function is AKA SNMPWalk to those familiar with SNMP commands.
$snmp.open("192.168.0.28","public",2,3000)
defined: (IP,account,how many attempts, how long before timeout)
Once connected, use the GetTree to find out information about the area you want in your report. In my example, I'm querying for the maximum volume of toner.
$snmp.gettree("43.11.1.1.8.1")
The OIDFromString function converts a name to its OID location.
For instance:
To capture an object:
$printertype = $snmp.Get(".1.3.6.1.2.1.25.3.2.1.3.1")
Since SNMP is a standard, most objects are in the same location across vendors. One area I found variance is the toner/waste container location. In printers with only one toner cartridge and no waste container, it's a standard:
$tonername = $snmp.get("43.11.1.1.6.1.1")
$tonercapacity = $snmp.get("43.11.1.1.8.1.1")
$currentvolume = $snmp.get("43.11.1.1.9.1.1")
Example of multi-cartridge printer (notice the last digit):
$blacktonercapacity = $snmp.get("43.11.1.1.8.1.1")
$blackcurrentvolume = $snmp.get("43.11.1.1.9.1.1")
[int]$blackpercentremaining = ($blackcurrentvolume / $blacktonercapacity) * 100
$cyantonervolume = $snmp.get("43.11.1.1.8.1.2")
$cyancurrentvolume = $snmp.get("43.11.1.1.9.1.2")
[int]$cyanpercentremaining = ($cyancurrentvolume / $cyantonercapacity) * 100
$magentatonervolume = $snmp.get("43.11.1.1.8.1.3")
$magentacurrentvolume = $snmp.get("43.11.1.1.9.1.3")
[int]$magentapercentremaining = ($magentacurrentvolume / $magentatonercapacity) * 100
$yellowtonervolume = $snmp.get("43.11.1.1.8.1.4")
$yellowcurrentvolume = $snmp.get("43.11.1.1.9.1.4")
[int]$yellowpercentremaining = ($yellowcurrentvolume / $yellowtonercapacity) * 100
$wastetonervolume = $snmp.get("43.11.1.1.8.1.10")
$wastecurrentvolume = [math]::round([math]::abs($snmp.get("43.11.1.1.9.1.10")))
[int]$wastepercentremaining = (($wastecurrentvolume / $wastetonercapacity) * 100)
Amongst the printers, all have their error status location in the same OID. Here's how I filtered my printers:
$statustree = $snmp.gettree("43.18.1.1.8")
$status = $statustree|? {$_ -notlike "print*"} #status, including low ink warnings
$status = $status|? {$_ -notlike "*bypass*"}
That's the basics to extracting printer information via SNMP. Here's how to explore your printers information using the free SNMP software which helped me out.
http://www.manageengine.com/products/mibbrowser-free-tool/
Clear out all the MIBs in the module area then File, Open the Printer MIB.
Once the Printer MIB has been loaded, start exploring by opening the tree and finding an area of interest. Right click on the folder and select SNMPWALK.
Here's an example of results of an OID folder search.
If you right-click on the folder and select "MIB Description", it'll give the OID location. Notice the .1.3.6.1.2.1.43.1.1, that will be used in your script.
Here I've copied/pasted the OID into my command line. Notice the difference between the GUI and command line. It's easy to navigate once you get to figuring out the structure.
Once you've found the SNMP information you'd like to report about, then it's time to build an input file and script. This is how I've built my solution, obviously there are several other methods to extracting and reporting this information.
Input text file (printerlist.txt):
192.168.0.236,PX_SPS_FIN_BW,Finance Printer
192.168.0.237,PX_SPS_FP_COLOR,Forest Practices
192.168.0.238,PX_SPS_MFC1,Main Color Copier
192.168.0.254,PH_SPS_PLT,Plotter
-Mineral
192.168.1.250,PX_MIN_BW
192.168.1.235,PX_MIN_MFC
Here's my script so you can download and customize for your use:
What you'll see when running the report (note that the printer names are coming directly from SNMP):
Script:
(By the way, I style my PowerShell scripts as if they were DOS batch files. I've been writing scripts since DOS 5.0/Novell 3.x using DOS Edit and Windows Notepad. Some habits are hard to break so thus this script is not in the typical PS script layout.)
In this example, I only give one printer 'if' statement. You'll have to use the $printertype = $snmp.Get(".1.3.6.1.2.1.25.3.2.1.3.1") to gather printer type information for your 'if' statements:
$printerlist = import-csv .\printerlist.txt -header Value,Name,Description
$outfile = .\Printers.html
$SNMP = new-object -ComObject olePrn.OleSNMP
$total = ($printerlist.value|? {$_ -notlike "-*"}).length
Write "`
<html>`
<head>`
<title>Printer Report</title>`
<style>* {font-family:'Trebuchet MS';}</style>`
</head>`
<body>"|out-file $outfile
write "Reporting on $total printers"
$x = 0
foreach ($p in $printerlist){
if ($p.value -like "-*"){write "<h3>",$p.value.replace('-',''),"</h3>"|add-content $outfile}
if ($p.value -notlike "-*"){
$x = $x + 1
$printertype = $nul
$status = $nul
$percentremaining = $nul
$blackpercentremaining = $nul
$cyanpercentremaining = $nul
$magentapercentremaining = $nul
$yellowpercentremaining = $nul
$wastepercentremaining = $nul
if (!(test-connection $p.Value -Quiet -count 1)){write ($p.value + " is offline<br>")|add-content $outfile}
if (test-connection $p.value -quiet -count 1){
$snmp.open($p.value,"public",2,3000)
$printertype = $snmp.Get(".1.3.6.1.2.1.25.3.2.1.3.1")
write ([string]$x + ": " + [string]$p.Value + " " + $printertype)
}
if ($printertype -like "*WorkCentre 5655*"){
$tonervolume = $snmp.get("43.11.1.1.8.1.1")
$currentvolume = $snmp.get("43.11.1.1.9.1.1")
[int]$percentremaining = 100 - (($currentvolume / $tonervolume) * 100)
$statustree = $snmp.gettree("43.18.1.1.8")
$status = $statustree|? {$_ -notlike "print*"} #status, including low ink warnings
$status = $status|? {$_ -notlike "*bypass*"}
$name = $snmp.get(".1.3.6.1.2.1.1.5.0")
if ($name -notlike "PX*"){$name = $p.name}
write ("<b>" + $p.description + "</b><a style='text-decoration:none;font-weight:bold;' href=http://" + $p.value + " target='_new'> " + $name + "</a> <br>" + $printertype + "<br>")|add-content $outfile
if ($percentremaining -gt 49){write "<b style='font-size:110%;color:green;'>",$percentremaining,"</b>% black toner<br>"|add-content $outfile}
if (($percentremaining -gt 24) -and ($percentremaining -le 49)){write "<b style='font-size:110%;color:#40BB30;'>",$percentremaining,"</b>% black toner<br>"|add-content $outfile}
if (($percentremaining -gt 10) -and ($percentremaining -le 24)){write "<b style='font-size:110%;color:orange;'>",$percentremaining,"</b>% black toner<br>"|add-content $outfile}
if (($percentremaining -ge 0) -and ($percentremaining -le 10)){write "<b style='font-size:110%;color:red;'>",$percentremaining,"</b>% black toner<br>"|add-content $outfile}
if ($status.length -gt 0){write ($status + "<br><br>")|add-content $outfile}else{write "Operational<br><br>"|add-content $outfile}
}
}}
write "</body></html>"|add-content $outfile
&$outfile
Sample output:
9 comments:
This is great! Thank you for posting this. Who would of known that the Snmp library was hiding in the OlePrn Class.
This script helped me out a lot. Do you know how to find out whether any paper trays are open and if the trays are empty or filled?
Thank you so much for positing this. Every other method for getting SNMP data via PowerShell has been far more problematic, this is much better and you were even doing it for the same reason, printer monitoring :).
Not working for me.
"WinSNMP API Error: For internal/undefined errors"
Thank you so much! I'm new to SNMP so this post helped me out a lot. I can now access all the information I need.
Worked like a charm! I used it to update the location field on 85 devices in about a minute - manual entries would have taken half a day.
Thanks!
How to load the printer module?(Printer-MIB)
I'd like to capture the amount of printed pages
Maximize your printing potential with Hp 952 Ink cartridges. Engineered for precision and vibrant color reproduction, HP 952 Ink ensures professional-quality documents and photos. Trust in the reliability of genuine HP cartridges to deliver consistent, smudge-resistant prints. Elevate your printing experience with HP 952 Ink—the key to unparalleled print performance.
Post a Comment