# other powershell snmp information # https://solvedbypowershell.blogspot.com/2014/12/powershell-using-snmp-for-html-network.html # https://www.powershellgallery.com/packages/Proxx.SNMP/1.0.1.2/Content/Invoke-SnmpGet.ps1 # https://www.powershellgallery.com/packages/Proxx.SNMP/1.0.0.1/Content/Invoke-SnmpWalk.ps1 # https://exchange.nagios.org/directory/Plugins/Hardware/Printers/SNMP-Printer-Check/details # https://www.powershellgallery.com/packages/Proxx.SNMP/1.1.1.4 # https://www.reddit.com/r/PowerShell/comments/77ls36/printer_page_counter_from_print_server/ # https://gallery.technet.microsoft.com/Get-PrintStatistics-a6bb8323 # https://gallery.technet.microsoft.com/scriptcenter/Script-to-generate-print-84bdcf69 function Get-SHSPrinter { param ( [string]$printer ) Write-Progress -Activity "Getting printer details for $name" -Status 'Getting IP Address' -PercentComplete 10 -ParentId 1 $snmp = New-Object -ComObject olePrn.OleSNMP #Gets the printer ip and full domain name $result = Get-PrinterIP $printer #CMDB Data Write-Progress -Activity "Getting printer details for $name" -Status 'Getting CMDB data' -PercentComplete 20 -ParentId 1 # $cmdbRecord = Get-LANDeskCMDBItem -Name $printer $cmdbRecord = Search-ISMBO -BO cis -filter "Name eq '$Printer'" -RawFilter $LocationConstructors = @( "SHS_AssetLocality", "ivnt_Location", "SHS_Floor", "SHS_Department", "SHS_LocationDetails" ) $LocationData = Foreach ($Loc in $LocationConstructors) { if ($Loc -eq 'SHS_Floor') { $(if ($cmdbRecord.$Loc -match '-') { $cmdbRecord.$Loc.split('-')[-1] + " Floor" } else { $cmdbRecord.$Loc }) } elseif (![string]::IsNullOrEmpty($cmdbRecord.$Loc)) { $cmdbRecord.$Loc } } $LocationData = $LocationData -join ' | ' # $locationData = $cmdbRecord.SHS_AssetLocality + " | " + $cmdbRecord.ivnt_Location + " | " + + " | " + $cmdbRecord.SHS_Department + " | " + $cmdbRecord.SHS_LocationDetails # if($cmdbRecord.values._SHSLocation3.Length -gt $cmdbRecord.values._SHSCalcLocationString.Length){ # $locationData = $cmdbRecord.values._SHSLocation3 # } # else{ # $locationData = $cmdbRecord.values._SHSCalcLocationString # } if ($cmdbRecord) { # $CMDB_POA = $cmdbRecord.values._SHSPOANumber # $CMDB_AssetTag = $cmdbRecord.values._SHSAssetTag # $CMDB_Location = $locationData # $CMDB_MAC = $cmdbRecord.values._SHSMACAddress # $CMDB_model = $cmdbRecord.values._Model # $CMDB_serial = $cmdbRecord.values._SerialNumber # $CMDB_IP = $cmdbRecord.values._IPAddress ### Spark Properties $CMDB_POA = $cmdbRecord.SHS_POANumber $CMDB_AssetTag = $cmdbRecord.AssetTag $CMDB_Location = $locationData $CMDB_MAC = $cmdbRecord.MACAddress $CMDB_model = $cmdbRecord.Model $CMDB_serial = $cmdbRecord.SerialNumber $CMDB_IP = $cmdbRecord.IPAddress } else { $CMDB_POA = "*CMDB Mismatch - check CMDB*" $CMDB_AssetTag = "*CMDB Mismatch - check CMDB*" $CMDB_Location = "*CMDB Mismatch - check CMDB*" $CMDB_MAC = "*CMDB Mismatch - check CMDB*" $CMDB_model = "*CMDB Mismatch - check CMDB*" $CMDB_serial = "*CMDB Mismatch - check CMDB*" $CMDB_IP = "*CMDB Mismatch - check CMDB*" } if ($result.IP -ne $null) { Write-Progress -Activity "Getting printer details for $name" -Status 'Connecting to printer' -PercentComplete 30 -ParentId 1 $printerip = $result.IP $domainName = $result.Path #checks to see if the printer is online $online = Test-Connection $printerip -ErrorAction SilentlyContinue if ($online) { #opens snmp connection to the printer $snmp.open($printerip, 'public', 2, 3000) Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for MAC address' -PercentComplete 40 -ParentId 1 # Start of MAC $pMAC = $SNMP.get(".1.3.6.1.2.1.2.2.1.6.2") $MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object { $_.ToString('X2') } $MAC = $MAC -join ':' #End of MAC Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for model' -PercentComplete 50 -ParentId 1 # MODEL try { $model = $snmp.Get('.1.3.6.1.2.1.25.3.2.1.3.1') } catch { $model = $null } # IF IT HAS A MODEL NAME... if ($model) { Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for color' -PercentComplete 60 -ParentId 1 # COLOR # might want to check on this one try { if ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.2') -match 'Toner|Cartridge|ink') { $color = 'Yes' } else { $color = 'No' } } catch { $color = 'No' } Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for trays' -PercentComplete 70 -ParentId 1 # TRAYS try { $trays = $($snmp.GetTree('.1.3.6.1.2.1.43.8.2.1.13') | ? { $_ -notlike 'print*' }) -join ';' } catch { $trays = $null } Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for serial numbers' -PercentComplete 80 -ParentId 1 # SERIAL try { $serial = $snmp.Get('.1.3.6.1.2.1.43.5.1.1.17.1') } catch { $serial = $null } Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for page count' -PercentComplete 90 -ParentId 1 #PAGECOUNT try { $pagecount = $snmp.Get('.1.3.6.1.2.1.43.10.2.1.4.1.1') } catch { $page = $null } Write-Progress -Activity "Getting printer details for $name" -Status 'Querying for model features' -PercentComplete 100 -ParentId 1 -Id 2 ##### FEATURES, NAME switch -Regex ($model) { '^sharp' { try { $status = $snmp.Get('.1.3.6.1.2.1.43.18.1.1.8.1.1') } catch { $status = $null } # Start of MAC $pMAC = $SNMP.get(".1.3.6.1.4.1.11.2.4.3.1.23.0") $MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object { $_.ToString('X2') } $MAC = $MAC -join ':' #End of MAC } '^zebra' { Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for name' -PercentComplete 10 -ParentId 2 try { $name = $snmp.Get('.1.3.6.1.4.1.10642.1.4.0').toupper() } catch { $name = $null } Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for model' -PercentComplete 30 -ParentId 2 try { $model = $snmp.Get('.1.3.6.1.4.1.10642.200.19.7.0').toupper() } catch { $model = $null } Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for MAC address' -PercentComplete 50 -ParentId 2 try { $MAC = $snmp.Get('.1.3.6.1.4.1.10642.20.10.20.10.2.1.5.2').toupper() } catch { $MAC = $null } Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for serial number' -PercentComplete 70 -ParentId 2 try { $serial = $snmp.Get('.1.3.6.1.4.1.10642.200.19.5.0') } catch { $serial = $null } # try { $status = $snmp.Get('.1.3.6.1.4.1.10642.200.4.1.0') } catch { $status = $null } # Zebra GK420 Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for IP assignment mode' -PercentComplete 80 -ParentId 2 try { $ipconfig = "($($snmp.Get('.1.3.6.1.4.1.10642.200.50.1.1.5.0')))" } catch { $ipconfig = $null } # Zebra ZD421 if (!$ipconfig) { Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for IP assignment mode (2nd attempt)' -PercentComplete 85 -ParentId 2 try { $ipconfig = $snmp.Get('.1.3.6.1.4.1.10642.20.10.20.15.2.1.5.2') } catch { $ipconfig = $null } $ipconfig = switch ($ipconfig) { 1 {'(All)'} 2 {'(GLEANING ONLY)'} 3 {'(RARP)'} 4 {'(BOOTP)'} 5 {'(DHCP)'} 6 {'(DHCP AND BOOTP)'} 7 {'(PERMANENT)'} } } $model = "Zebra $model" Write-Progress -Activity "Getting zebra features from $name" -Status 'Querying for status' -PercentComplete 90 -ParentId 2 #STATUS $uri = $domainName $html = Invoke-WebRequest -uri $uri $raw = $html.rawcontent $raw -match '([A-Z])\w+<.F' | Out-Null $status = ($Matches[0] -split '<')[0] #split off error condition $raw -match 'RED>.+' | Out-Null $split = $Matches[0] -split '>' $err = $split[1] -split '<' $status = $status + ' ' + $err[0] Write-Progress -Activity "Getting zebra features from $name" -Completed } '^lexmark' { Write-Progress -Activity "Getting lexmark features from $name" -Status 'Querying for name' -PercentComplete 50 -ParentId 2 try { $name = $snmp.Get('.1.3.6.1.4.1.641.1.5.7.6.0').toupper() } catch { $name = $null } Write-Progress -Activity "Getting lexmark features from $name" -Completed } '^ricoh' { Write-Progress -Activity "Getting ricoh features from $name" -Status 'Querying for name' -PercentComplete 50 -ParentId 2 try { $name = $snmp.Get('.1.3.6.1.4.1.367.3.2.1.7.3.5.1.1.2.1.1').toupper() } catch { $name = $null } Write-Progress -Activity "Getting ricoh features from $name" -Completed } '^hp' { Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for name' -PercentComplete 5 -ParentId 2 try { $name = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.5.46.0').toupper() } catch { $name = $null } Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for status' -PercentComplete 10 -ParentId 2 try { $status = $snmp.Get('.1.3.6.1.4.1.11.2.3.9.1.1.3.0') } catch { $status = $null } Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for IP configuration' -PercentComplete 10 -ParentId 2 try { $ipconfig = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.5.1.0') } catch { $status = $null } $ipconfig = switch ($ipconfig) { 1 { '(manual)' } #manual-one 2 { '(bootp)' } #bootp-two 3 { '(manual)' } #manual-three 4 { '(bootp)' } #bootp-four 5 { '(dhcp)' } #dhcp 6 { '' } #not-configured 7 { '(default)' } #default-config 8 { '(rarp)' } #rarp 9 { '' } #read-only 10 { '(auto-ip)' } #auto-ip } if ($MAC -eq '') { Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for MAC Address' -PercentComplete 15 -ParentId 2 $pMAC = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.1.12.1.2.5') $MAC = ($pMAC -split " ")[-1] $MAC = ($MAC -replace '(..)', '$1:').trim(':') } #TONER <# HP Maintenance Kit Cur: 1.3.6.1.2.1.43.11.1.1.9.1.2 HP Maintenance Kit Max: 1.3.6.1.2.1.43.11.1.1.8.1.2 HP Toner Cur: 1.3.6.1.2.1.43.11.1.1.9.1.1 HP Toner Max: 1.3.6.1.2.1.43.11.1.1.8.1.1 #> Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for toner color' -PercentComplete 20 -ParentId 2 try { $tonerColor = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.1') -split ' ')[0] } catch { $tonerColor = $null } Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for toner level' -PercentComplete 25 -ParentId 2 try { $tonerLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.1') } catch { $tonerLvl = $null } try { $tonerMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.1') } catch { $tonerMax = $null } try { $toner = $tonerLvl / $tonerMax } catch { $toner = $null } [int]$toner = $toner * 100 $supplies = "$tonerColor" + ":$toner% " if ($color -eq 'Yes') { Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for toner color levels' -PercentComplete 35 -ParentId 2 try { $tonerColor = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.2') -split ' ')[0] } catch { $tonerColor = $null } try { $tonerLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.2') } catch { $tonerLvl = $null } try { $tonerMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.2') } catch { $tonerMax = $null } try { $toner = $tonerLvl / $tonerMax * 100 } catch { $toner = $null } $supplies += "$tonerColor" + ":$toner% " Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for toner color levels' -PercentComplete 50 -ParentId 2 try { $tonerColor = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.3') -split ' ')[0] } catch { $tonerColor = $null } try { $tonerLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.3') } catch { $tonerLvl = $null } try { $tonerMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.3') } catch { $tonerMax = $null } try { $toner = $tonerLvl / $tonerMax * 100 } catch { $toner = $null } $supplies += "$tonerColor" + ":$toner% " Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for toner color levels' -PercentComplete 65 -ParentId 2 try { $tonerColor = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.4') -split ' ')[0] } catch { $tonerColor = $null } try { $tonerLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.4') } catch { $tonerLvl = $null } try { $tonerMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.4') } catch { $tonerMax = $null } try { $toner = $tonerLvl / $tonerMax * 100 } catch { $toner = $null } $supplies += "$tonerColor" + ":$toner% " Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for maintenance kit status' -PercentComplete 80 -ParentId 2 try { $supplyName = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.6') -split ' ')[0] } catch { $tonerColor = $null } if ($supplyName -contains 'Fuser' -or $supplyName -contains 'Maint') { try { $supplyPartNumber = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.6') } catch { $supplyPartNumber = $null } $supplyPartNumber -match '110V-(?.+), ' | Out-Null $supplyPartNumber = $Matches.Name try { $mainLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.6') } catch { $mainLvl = $null } try { $mainMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.6') } catch { $mainMax = $null } if ($mainMax -gt 1) { try { $maintKit = $mainLvl / $mainMax } catch { $maintKit = $null } [int]$maintKit = $maintKit * 100 if ($null -ne $maintKit) { $supplies += "| $supplyName" + ":$maintKit%[$supplyPartNumber]" } } } else { try { $supplyName = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.5') -split ' ')[1] } catch { $tonerColor = $null } try { $supplyPartNumber = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.5') } catch { $supplyPartNumber = $null } $supplyPartNumber -match '110V-(?.+), ' | Out-Null $supplyPartNumber = $Matches.Name try { $mainLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.5') } catch { $mainLvl = $null } try { $mainMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.5') } catch { $mainMax = $null } if ($mainMax -gt 1) { try { $maintKit = $mainLvl / $mainMax } catch { $maintKit = $null } [int]$maintKit = $maintKit * 100 if ($null -ne $maintKit) { $supplies += "| $supplyName" + ":$maintKit%[$supplyPartNumber]" } } } } else { Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for maintenance kit status' -PercentComplete 80 -ParentId 2 try { $supplyName = ($snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.2') -split ' ')[0] } catch { $supplyName = $null } try { $supplyPartNumber = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.6.1.2') } catch { $supplyPartNumber = $null } $supplyPartNumber -match '110V-(?.+), ' | Out-Null $supplyPartNumber = $Matches.Name try { $mainLvl = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.9.1.2') } catch { $mainLvl = $null } try { $mainMax = $snmp.Get('.1.3.6.1.2.1.43.11.1.1.8.1.2') } catch { $mainMax = $null } if ($mainMax -gt 1) { try { $maintKit = $mainLvl / $mainMax } catch { $maintKit = $null } [int]$maintKit = $maintKit * 100 if ($null -ne $maintKit) { $supplies += "| $supplyName" + ":$maintKit%[$supplyPartNumber]" } } } Write-Progress -Activity "Getting hp features from $name" -Completed } '^muratec' { Write-Progress -Activity "Getting muratec features from $name" -Status 'Querying for name' -PercentComplete 30 -ParentId 2 try { $name = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.5.46.0').toupper() } catch { $name = $null } Write-Progress -Activity "Getting muratec features from $name" -Status 'Querying for status' -PercentComplete 60 -ParentId 2 try { $status = $snmp.Get('.1.3.6.1.2.1.43.16.5.1.2.1.1') } catch { $status = $null } # Start of MAC Write-Progress -Activity "Getting muratec features from $name" -Status 'Querying for MAC address' -PercentComplete 90 -ParentId 2 $pMAC = $SNMP.get('.1.3.6.1.4.1.4322.101.1.2.1.5.2.1.1.3.1') Write-Host $pMAC $MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object { $_.ToString('X2') } $MAC = $MAC -join ':' #End of MAC Write-Progress -Activity "Getting muratec features from $name" -Completed } default { } }#end switch -Regex ($model) #if ($model -like 'SHARP*') {} }#end if ($model) } else { $status = "Offline" $MAC = $CMDB_MAC $model = $CMDB_model $serial = $CMDB_serial $color = "Offline" $trays = "Offline" $pagecount = "Offline" } $props = [Ordered]@{ Machine = $printer Status = $status IP = "$printerip $ipconfig" DomainName = $domainName MAC = $MAC Model = $model Serial = $serial #Comment = $comment Color = $color Trays = $trays #Features = $features #SystemDescription = $sysdescr0 #Addresses = $addr PageCount = $pagecount Supplies = $supplies 'CMDB POA' = $CMDB_POA 'CMDB AssetTag' = $CMDB_AssetTag 'CMDB Location' = $CMDB_Location } $obj = New-Object -TypeName PSObject -Property $props $snmp.close() Write-Progress -Activity "Getting printer details for $name" -Completed return $obj }#end if ($printerIp) if ($CMDB_IP) { $offlineIP = 'CMDB IP - ' + $CMDB_IP } else { $offlineIP = 'No DNS Entry' } $props = [Ordered]@{ Machine = $printer Status = 'No DNS Entry' IP = $offlineIP DomainName = 'No DNS Entry' MAC = $CMDB_MAC Model = $CMDB_model Serial = $CMDB_serial #Comment = $comment Color = 'No DNS Entry' Trays = 'No DNS Entry' PageCount = 'No DNS Entry' 'CMDB POA' = $CMDB_POA 'CMDB AssetTag' = $CMDB_AssetTag 'CMDB Location' = $CMDB_Location } $obj = New-Object -TypeName PSObject -Property $props $snmp.close() return $obj } function Get-PrinterIP { param ( [parameter(ValueFromPipeline)] [string]$printer ) $hit = $false $domains = @('.gsrmc.int.samhealth.net','.avery.int.samhealth.net','.sagh.int.samhealth.net','.snlh.int.samhealth.net','.slch.int.samhealth.net','.spch.int.samhealth.net') $result = Resolve-DnsName $printer -ErrorAction SilentlyContinue if($result -eq $null){ $hit = $false foreach ($domain in $domains) { $search = "$printer$domain" $result = Resolve-DnsName $search -ErrorAction SilentlyContinue if($result -ne $null){ $hit = $true $name = $result.Name $ip = $result.IPAddress } } if($result -eq $null){ if($hit -eq $false){ $ip = $null $name = $null } } } else{ $name = $result.Name $ip = $result.IPAddress } $props = [ordered]@{Hostname=$printer IP=$ip Path=$name } $obj = New-Object -TypeName PSObject -Property $props return $obj } function Start-SHSPrinterWeb { param( $printer ) process { if($printer.DomainName -ne 'No DNS Entry' -and $printer.MAC -ne 'Offline'){ $domainName = $printer.DomainName start "http://$domainName" $mac = $printer.MAC Sleep -Seconds 1 start "https://azporion1/Orion/UDT/EndpointDetails.aspx?NetObject=UE-MAC:VAL=$mac" } else{ Write-Warning "Unable to launch web interface" } } }