If you want to quickly check the status of a network printer, the previously discussed ping and port-testing commands can tell you whether the printer is online. However, they cannot provide more detailed information, such as the printer type, paper level, or toner status.
Most network printers respond to port 9100 and can return rich SNMP information. The following function does exactly that. Don’t worry—most of the code is simply defining the SNMP ID numbers for the various printer properties you can query:
function Get-NetworkPrinterStatus
{
param
(
[Parameter(Mandatory,ValueFromPipeline)]
[System.String]
$IpAddress
)
begin
{
$oid = @{
RAW_DATA = ".1.3.6.1.2.1.43.18.1.1"
CONSOLE_DATA = ".1.3.6.1.2.1.43.16"
CONTACT = ".1.3.6.1.2.1.1.4.0"
LOCATION = ".1.3.6.1.2.1.1.6.0"
SERIAL_NUMBER = ".1.3.6.1.2.1.43.5.1.1.17.1"
SYSTEM_DESCRIPTION = ".1.3.6.1.2.1.1.1.0"
DEVICE_DESCRIPTION = ".1.3.6.1.2.1.25.3.2.1.3.1"
DEVICE_STATE = ".1.3.6.1.2.1.25.3.2.1.5.1"
DEVICE_ERRORS = ".1.3.6.1.2.1.25.3.2.1.6.1"
UPTIME = ".1.3.6.1.2.1.1.3.0"
MEMORY_SIZE = ".1.3.6.1.2.1.25.2.2.0"
PAGE_COUNT = ".1.3.6.1.2.1.43.10.2.1.4.1.1"
HARDWARE_ADDRESS = ".1.3.6.1.2.1.2.2.1.6.1"
TRAY_1_NAME = ".1.3.6.1.2.1.43.8.2.1.13.1.1"
TRAY_1_CAPACITY = ".1.3.6.1.2.1.43.8.2.1.9.1.1"
TRAY_1_LEVEL = ".1.3.6.1.2.1.43.8.2.1.10.1.1"
TRAY_2_NAME = ".1.3.6.1.2.1.43.8.2.1.13.1.2"
TRAY_2_CAPACITY = ".1.3.6.1.2.1.43.8.2.1.9.1.2"
TRAY_2_LEVEL = ".1.3.6.1.2.1.43.8.2.1.10.1.2"
TRAY_3_NAME = ".1.3.6.1.2.1.43.8.2.1.13.1.3"
TRAY_3_CAPACITY = ".1.3.6.1.2.1.43.8.2.1.9.1.3"
TRAY_3_LEVEL = ".1.3.6.1.2.1.43.8.2.1.10.1.3"
TRAY_4_NAME = ".1.3.6.1.2.1.43.8.2.1.13.1.4"
TRAY_4_CAPACITY = ".1.3.6.1.2.1.43.8.2.1.9.1.4"
TRAY_4_LEVEL = ".1.3.6.1.2.1.43.8.2.1.10.1.4"
BLACK_TONER_CARTRIDGE_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.1"
BLACK_TONER_CARTRIDGE_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.1"
BLACK_TONER_CARTRIDGE_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.1"
CYAN_TONER_CARTRIDGE_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.2"
CYAN_TONER_CARTRIDGE_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.2"
CYAN_TONER_CARTRIDGE_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.2"
MAGENTA_TONER_CARTRIDGE_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.3"
MAGENTA_TONER_CARTRIDGE_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.3"
MAGENTA_TONER_CARTRIDGE_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.3"
YELLOW_TONER_CARTRIDGE_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.4"
YELLOW_TONER_CARTRIDGE_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.4"
YELLOW_TONER_CARTRIDGE_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.4"
WASTE_TONER_BOX_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.5"
WASTE_TONER_BOX_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.5"
WASTE_TONER_BOX_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.5"
BELT_UNIT_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.6"
BELT_UNIT_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.6"
BELT_UNIT_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.6"
BLACK_DRUM_UNIT_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.7"
BLACK_DRUM_UNIT_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.7"
BLACK_DRUM_UNIT_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.7"
CYAN_DRUM_UNIT_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.8"
CYAN_DRUM_UNIT_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.8"
CYAN_DRUM_UNIT_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.8"
MAGENTA_DRUM_UNIT_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.9"
MAGENTA_DRUM_UNIT_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.9"
MAGENTA_DRUM_UNIT_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.9"
YELLOW_DRUM_UNIT_NAME = ".1.3.6.1.2.1.43.11.1.1.6.1.10"
YELLOW_DRUM_UNIT_CAPACITY = ".1.3.6.1.2.1.43.11.1.1.8.1.10"
YELLOW_DRUM_UNIT_LEVEL = ".1.3.6.1.2.1.43.11.1.1.9.1.10"
}
$SNMP = New-Object -ComObject olePrn.OleSNMP
}
process
{
$SNMP.Open($IpAddress,'public')
$hash = [Ordered]@{}
$hash['IPAddress'] = $IpAddress
$oid.Keys |
Sort-Object |
ForEach-Object {
$hash[$_] = try { $SNMP.Get($oid[$_]) } catch { '<NOINFO>' }
}
$SNMP.Close()
return [PSCustomObject]$hash
}
}This time, the function doesn’t use .NET but instead relies on the older COM libraries. Specifically, it uses olePrn.OleSNMP to handle the heavy lifting. Since COM is available only on Windows, this function cannot run on other operating systems.
Querying a printer and its configuration is now as simple as this:
PS C:\> Get-NetworkPrinterStatus -IpAddress 192.168.2.250
IPAddress : 192.168.2.250
BLACK_TONER_CARTRIDGE_CAPACITY : 18000
BLACK_TONER_CARTRIDGE_LEVEL : 12780
BLACK_TONER_CARTRIDGE_NAME : Black Print Cartridge HP Q1339A
CYAN_TONER_CARTRIDGE_CAPACITY : 200000
CYAN_TONER_CARTRIDGE_LEVEL : 176000
CYAN_TONER_CARTRIDGE_NAME : Maintenance Kit HP 110V-Q2436A, 220V-Q2437A
DEVICE_DESCRIPTION : hp LaserJet 4300
DEVICE_ERRORS : 0
DEVICE_STATE : 3
MEMORY_SIZE : 81920
PAGE_COUNT : 26580
RAW_DATA : <NOINFO>
SERIAL_NUMBER : CNFY601687
SYSTEM_DESCRIPTION : HP ETHERNET MULTI-ENVIRONMENT,ROM R.22.01,JETDIRECT,JD95,EEPROM
R.24.08,CIDATE 02/26/2003
TRAY_1_CAPACITY : 100
TRAY_1_LEVEL : 0
TRAY_1_NAME : TRAY 1
TRAY_2_CAPACITY : 500
...You can also pipe in a list of network printers and select only the properties you need:
PS C:\> '192.168.2.250', '192.168.2.251' | Get-NetworkPrinterStatus | Select-Object -Property IPAddress, Device_Description, Serial_Number, Device_Errors
IPAddress DEVICE_DESCRIPTION SERIAL_NUMBER DEVICE_ERRORS
--------- ------------------ ------------- -------------
192.168.2.250 hp LaserJet 4300 CNFY601687 0
192.168.2.251 C843 AL81045815 0 Unfortunately, the COM component does not allow you to specify timeouts and uses a very long timeout if the specified address does not respond on port 9100.
Thanks to Test-Port, which we discussed earlier in this series, you can first check for a response on port 9100 before using COM to query information.
Related links
- ScriptRunner ActionPacks will help you automate tasks
- Try out ScriptRunner here
- ScriptRunner: Book a demo with our product experts

