
Jeder Admin kennt es das leidige Problem mit den Druckern deren Tonerständen oder Pagecountern, wenn diese mindestens einmal im Jahr ausgelesen und überprüft werden müssen. Mit Hilfe von Powershell und SNMP kann dies nun sehr bequem oder auch automatisiert erfolgen.
mit Powershell SNMP auslesen
Das Script verbindet sich zum Windows Printserver mit „Get-Printer“, liest die dort eingerichteten Drucker mit deren IP-Adressen aus „$printer.PortName.ToString()“ und verbindet sich anschließend via SNMP zu den Drucker um deren Status zum Tonerstand und Pagecounter auszulesen.
„$SNMP = New-Object -ComObject olePrn.OleSNMP“ und “$SNMP.Open($printer_ip, „public“)“
Im Ergebnis wird eine CSV-Datei erstellt die dann bequem über Excel ausgewertet werden kann.
Es gibt allgemeine MIB die Druckername, Modell und Pagecounter zurückliefern. Wer genau wissen möchte, was der Drucker per SNMP alles zurückgeben kann, sollte einen SNMP-Walk machen. Ist ziemlich einfach mit Powershell SNMP auslesen was?
Standard OID’s für die SNMP-Abfrage des Druckers
$drucker_serialnummer=$SNMP.get('.1.3.6.1.2.1.43.5.1.1.17.1')
$drucker_model=$SNMP.get('.1.3.6.1.2.1.43.5.1.1.16.1')
$pagecounter=$SNMP.get('.1.3.6.1.2.1.43.10.2.1.4.1.1')
herstellerspezifische SNMP OID’s für Ricoh Maschinen
$pagecounter_farbeausdruck=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.17')
$pagecounter_farbkopien=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.60')
$pagecounter_schwarz_weiss_audruck=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.18')
$pagecounter_schwarz_weiss_kopien=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.61')
$toner_k=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.1')
$toner_c=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.2')
$toner_m=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.3')
$toner_y=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.4')
das Script
###
### printserver informations
$selected_printserver=meinprintserver.local ## hostname oder IP-Adresse
if (-not (Test-Connection -ComputerName $selected_printserver -Count 1 -Quiet)){
$Pingcheckresult_failed = 1;
Write-Host "- Pingcheck failed! skip server "$selected_printserver
}else{
Write-Host "- Pingcheck successful: "$selected_printserver
$print_srv=Get-Printer -ComputerName $selected_printserver
$csv_data="Name;serialnumber;model;PrinterIP;ComputerName;DriverName;PortName;Description;P_count;p_count_clr_print;p_count_clr_copy;p_count_bw_print;p_count_bw_copy;toner_k;toner_c;toner_m;toner_y;placeholder`r`n"
foreach ($printer in $print_srv){
$printer_portname=$printer.PortName.ToString()
write-host "- ping1 to: $printer_portname"
$ping_result=Test-Connection -ComputerName $printer_portname -Count 1
if($printer_portname -notmatch "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"){
$printer_ip=$ping_result.IPV4Address.IPAddressToString
write-host "- ping2 to: $printer_ip"
}else{
$printer_ip=$printer_portname
}
#reset SNMP data
$dev_type="n.a"
$dev_name="n.a"
$device_serialnumber="n.a"
$device_model="n.a"
$pagecounter="n.a"
$pagecounter_clr_prnt="n.a"
$pagecounter_clr_copy="n.a"
$pagecounter_bw_prnt="n.a"
$pagecounter_bw_copy="n.a"
$toner_k="n.a"
$toner_c="n.a"
$toner_m="n.a"
$toner_y="n.a"
$pagecounter="n.a"
if(Test-Connection -ComputerName $printer_ip -Count 1 -Quiet){
write-host "- get SNMP data from "+$printer_ip
$SNMP = New-Object -ComObject olePrn.OleSNMP
$SNMP.Open($printer_ip, "public")
## generic OID's
$device_serialnumber=$SNMP.get('.1.3.6.1.2.1.43.5.1.1.17.1')
$device_model=$SNMP.get('.1.3.6.1.2.1.43.5.1.1.16.1')
$pagecounter=$SNMP.get('.1.3.6.1.2.1.43.10.2.1.4.1.1') #1.3.6.1.4.1.367.3.2.1.2.19.1.0
## ricoh specific
$pagecounter_clr_prnt=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.17')
$pagecounter_clr_copy=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.60')
$pagecounter_bw_prnt=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.18')
$pagecounter_bw_copy=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.61')
$toner_k=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.1')
$toner_c=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.2')
$toner_m=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.3')
$toner_y=$SNMP.get('.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.4')
$SNMP.Close()
}
$csv_data+=$printer.Name+";"
$csv_data+="$device_serialnumber;"
$csv_data+="$device_model;"
$csv_data+="$printer_ip;"
$csv_data+=$printer.ComputerName+";"
$csv_data+=$printer.DriverName+";"
$csv_data+=$printer.PortName+";"
$csv_data+=$printer.Description+";"
$csv_data+="$pagecounter;"
$csv_data+="$pagecounter_clr_prnt;"
$csv_data+="$pagecounter_clr_copy;"
$csv_data+="$pagecounter_bw_prnt;"
$csv_data+="$pagecounter_bw_copy;"
$csv_data+="$toner_k;"
$csv_data+="$toner_c;"
$csv_data+="$toner_m;"
$csv_data+="$toner_y;"
$csv_data+="`r`n"
}
$csv_data | out-file $csv_printer_file
$cleanup_files+=$csv_printer_file
}
$csv_data="" #reset
Kommentare
5 Antworten zu „Mit Powershell SNMP auslesen – Druckerstatus Printserver“
Hi Matze,
ich würde das script gerne als Neuling von Powershell verstehen.
Ich bekomme immer folgende Fehlermeldung
Test-Connection : Das Argument für den Parameter „ComputerName“ kann nicht überprüft werden. Das Argument ist NULL
oder leer. Geben Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie den Befehl erneut aus.
In C:\Users\administrator.WEBER\Desktop\drucker3.ps1:6 Zeichen:41
+ if (-not (Test-Connection -ComputerName $selected_printserver -Count …
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Test-Connection], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.TestConnectionCommand
Muss ich selber eine csv Datei erstellen.
Laut google sollen Einträge in der CSV Datei fehlen. Ich dachte, das das script mir eine CSV Datei erstellt.
Kannst du kurz mit Tipps helfen ?
Vielen Dank Sven
Hi Sven,
das Script erstellt keine CSV Datei! Die CSV mit den Servernamen musst du anlegen und dem Script übergeben! Gruß Mathias
Hallo Matze,
danke dir.
Hallo Matze,
das Script würde mich sehr interessieren, wo finde ich es? In diesem Beitrag habe ich es nicht gesehen.Kannst du das Script hier noch einmal aufzeigen?
Hi Lars,
ich habe das Script hinzugefügt.
Viel Spaß mit den Zeilen.