Abfragen von Druckerinformationen per Powershell

In Unternehmen werden Drucker häufig zusammen mit einem Wartungsvertrag geleast, der die Drucker, den Toner und die Ersatzteile sowie die Wartung enthält. Im Leasingvertrag ist dann auch meistens eine bestimmte Anzahl an gedruckten Seiten vereinbart die im Preis inklusive sind. Abhängig davon wie es im Vertrag vereinbart ist müssen die gedruckten Seiten in bestimmten Intervallen übermittelt werden, damit die Mehrausdrucke abgerechnet werden können. Dazu verwenden die Hersteller gerne eine Blackbox die sie in das Unternehmensnetzwerk einbinden. Diese Box fragt automatisch die Zählerstände und das Verbrauchsmaterial ab und übermittelt diese an den Hersteller. Somit kann z.B. auch automatisch Toner nachbestellt werden, wenn dieser bei einem Drucker zu Ende geht. Zum Einsatz kommt hier das SNMP-Protokoll, mit dem die Information aus den Druckern ausgelesen werden.

Sehr vielen Administratoren ist diese Blackbox äußerst suspekt, da diese nicht wirklich wissen, was diese Box sonst noch alles in ihrem Netzwerk veranstaltet. Als Alternative bleibt dem Administrator dann nur übrig die Zählerstände manuell auszulesen, was ziemlich mühsam werden kann. Es gibt aber auch eine einfache Methode die Zähler- und Tonerstände zu ermitteln, wenn man nicht bereit ist sich eine Blackbox ins Unternehmensnetzwerk zu stellen. Wie bereits erwähnt verwenden diese Blackboxen das SNMP-Protokoll um an die Information zu gelangen. Es gibt zahlreiche Freeware-Tools mit denen man SNMP-Abfragen an Geräte schicken kann. Eines ist z.B. das Tool SNMP-Tools von digigrupp.com. Dieses Tool arbeitet in der Eingabeaufforderung ohne GUI, was es ermöglicht die Abfragen per Skript zu automatisieren. Was man für die Abfrage der Zähler- und Tonerstände benötigt ist die sogenannte OID, eine numerische Adresse an der die Information hinterlegt ist. Diese OID ist leider von Hersteller zu Hersteller unterschiedlich, aber die OIDs sind mit Hilfe der Suchmaschine seiner Wahl problemlos herauszufinden.

Folgendes Skript bietet einen Ansatz, wie man mit Hilfe von Powershell und einem SNMP-Tool die Zähler und Tonerstände von Druckern automatisiert auslesen und sich diese per E-Mail zusenden lassen kann.


#Global settings

$stats =””

$CAN_Printers =(“192.168.150.235″,”192.168.150.236″,”192.168.150.237″)
$CAN_SNOID =”1.3.6.1.4.1.1602.1.2.1.4.0″
$CAN_IDOID =”1.3.6.1.2.1.1.5.0″
$CAN_PC1OID =”1.3.6.1.4.1.1602.1.11.1.3.1.4.112″
$CAN_PC2OID =”1.3.6.1.4.1.1602.1.11.1.3.1.4.106″
$CAN_PC3OID =”1.3.6.1.4.1.1602.1.11.1.3.1.4.109″
$CAN_TLBOID =”1.3.6.1.2.1.43.11.1.1.9.1.1″
$CAN_TLCOID =”1.3.6.1.2.1.43.11.1.1.9.1.2″
$CAN_TLMOID =”1.3.6.1.2.1.43.11.1.1.9.1.3″
$CAN_TLYOID =”1.3.6.1.2.1.43.11.1.1.9.1.4”

# Collect information from Canon Color printers
foreach ($printer in $CAN_Printers)
{
#Drucker aufwecken
$ping = “C:\Windows\system32\ping.exe ” + $printer + ” -n 10″
$foo = Invoke-Expression $ping

#Verbindung zu Drucker prüfen
$ping = “C:\Windows\system32\ping.exe ” + $printer + ” -n 1″
$foo = Invoke-Expression $ping

if ($foo -like (“*Empfangen = 1*”))
{

$dummy = “`r`n”

$sn_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_SNOID
$id_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_IDOID
$pc1_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_PC1OID
$pc2_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_PC2OID
$pc3_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_PC3OID
$tlb_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_TLBOID
$tlc_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_TLCOID
$tlm_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_TLMOID
$tly_cmd = “C:\Skripte\PrinterAccounting\snmptools.exe /v /query /h:” + $printer + ” /o:”+$CAN_TLYOID

$sn = Invoke-Expression $sn_cmd
$id = (Invoke-Expression $id_cmd).Replace(“?”,””)
$pc1 = Invoke-Expression $pc1_cmd
$pc2 = Invoke-Expression $pc2_cmd
$pc3 = Invoke-Expression $pc3_cmd
$tlb = Invoke-Expression $tlb_cmd
$tlc = Invoke-Expression $tlc_cmd
$tlm = Invoke-Expression $tlm_cmd
$tly = Invoke-Expression $tly_cmd

$dummy += “Druckername: ” + $id + “`r`n”
$dummy += “Seriennummer: ” + $sn + “`r`n”
$dummy += “Seitenzähler A3 schwarz: ” + $pc1 + “`r`n”
$dummy += “Seitenzähler A4 farbe: ” + $pc2 + “`r`n”
$dummy += “Seitenzähler A4 schwarz: ” + $pc3 + “`r`n”
$dummy += “Tonerlevel black: ” + $tlb + “`r`n”
$dummy += “Tonerlevel cyan: ” + $tlc + “`r`n”
$dummy += “Tonerlevel magenta: ” + $tlm + “`r`n”
$dummy += “Tonerlevel yellow: ” + $tly + “`r`n”

$stats += $dummy

}

}

Send-MailMessage -SmtpServer 192.168.150.3 -From “drucker@domain.invalid” -Subject “Druckerauswertung” -To “druckeradmin@domain.invalid” -Body: $stats -Encoding “UTF8”


Am Anfang des Skripts werden die IP-Adressen der Drucker in einem Array abgespeichert, über das später geloopt wird. Die OIDs mit den gewünschten Informationen werden in einzelnen Variablen abgelegt. Danach beginnt das Skript über die einzelnen IP-Adressen zu durchlaufen. Da es vorkommen kann, dass sich die Drucker im Standby-Modus befinden wird zunächst der Drucker mit 10 Ping-Anfragen aufgeweckt. Im Anschluss daran wird eine weitere Ping-Anfrage an den Drucker gesendet, um sicher zu stellen, dass der Drucker erreichbar und nicht ausgeschalten ist, dazu wird überprüft ob die eine Ping-Anfrage erfolgreich war.
Wenn der Drucker erreichbar ist, dann wird in weiteren Variablen pro OID die Syntax für den Aufruf des SNMP-Tools zusammengesetzt und diese im Anschluss ausgeführt. Das Ergebnis der Abfragen wird wiederum in Variablen gespeichert, damit diese später weiterverarbeitet werden können, wie z.B. eine Prüfung ob der Tonerstand niedriger als 10% ist. In diesem Beispielskript werden die Ergebnisse nur dazu genutzt, um die Werte per E-Mail an den zuständigen Administrator zu schicken.

Per geplantem Task kann man nun wöchentlich oder monatlich sich die Werte automatisiert aus den Druckern auslesen lassen und muss somit nicht die Zählerstände per Hand ablesen. Mit Hilfe dieses kleinen Skripts ist es somit möglich auf die Blackbox der Hersteller zu verzichten und kann trotzdem komfortabel die Informationen aus den Druckern an den Hersteller übermitteln.

HINWEIS: Wer möchte kann dieses Skript gerne einsetzen und für seine Bedürfnisse anpassen. Ich übernehme allerdings keine Haftung für eventuelle Probleme oder Schäden, die mit dem Einsatz des Skriptes auftreten! Die Verwendung des Skripts erfolgt somit auf Ihre eigene Gefahr!

leave your comment

Sicherheitsabfrage: * Time limit is exhausted. Please reload CAPTCHA.