我們試圖建立一個打印服務器上的所有打印機的列表以及它們各自HostAddress
他們所使用的共享端口。要做到這一點,我們創建了以下功能:PowerShell的打印機端口屬性hostaddress並不總是填充
Function Get-PrintersInstalledHC {
Param (
[Parameter(ValueFromPipeline)]
[Object[]]$Servers
)
Process {
foreach ($S in $Servers) {
Try {
if ($Printers = Get-Printer -ComputerName $S.Name -Full -EA Stop) {
$CimParams = @{
ClassName = 'Win32_PrinterConfiguration'
ComputerName = $S.Name
Property = '*'
ErrorAction = 'Stop'
}
$Details = Get-CimInstance @CimParams
$Ports = Get-CimInstance -ClassName Win32_TCPIPPrinterPort -ComputerName $S.Name -Property *
Foreach ($P in $Printers) {
Foreach($D in $Details) {
if ($P.Name -eq $D.Name) {
$Prop = @{
PortHostAddress = $Ports | Where {$_.Name -eq $P.PortName} |
Select -ExpandProperty HostAddress
DriverVersion = $D.DriverVersion
Collate = $D.Collate
Color = $D.Color
Copies = $D.Copies
Duplex = $D.Duplex
PaperSize = $D.PaperSize
Orientation = $D.Orientation
PrintQuality = $D.PrintQuality
MediaType = $D.MediaType
DitherType = $D.DitherType
RetrievalDate = (Get-Date -Format 'dd/MM/yyyy HH:mm')
}
$P | Add-Member -NotePropertyMembers $Prop -TypeName NoteProperty
Break
}
}
}
[PSCustomObject]@{
ComputerName = $S.Name
ComputerStatus = 'Ok'
RetrievalDate = (Get-Date -Format 'dd/MM/yyyy HH:mm')
Printers = $Printers
}
}
}
Catch {
if (Test-Connection $S.Name -Count 2 -EA Ignore) {
[PSCustomObject]@{
ComputerName = $S.Name
ComputerStatus = "ERROR: $($Error[0].Exception.Message)"
RetrievalDate = (Get-Date -Format 'dd/MM/yyyy HH:mm')
Printers = $null
}
}
else {
[PSCustomObject]@{
ComputerName = $S.Name
ComputerStatus = 'Offline'
RetrievalDate = (Get-Date -Format 'dd/MM/yyyy HH:mm')
Printers = $null
}
}
}
}
}
}
此功能在混合環境很好,給我們安裝了其性能的服務器上的所有打印機的完整列表。然而,HostAddress
(在上面的函數中更名爲PortHostAddress
)的屬性並不總是被填充。
這也用下面的代碼說明,因爲不是所有的打印機在輸出:所有打印機的HostAddress
的
Get-WmiObject Win32_Printer -ComputerName $PrintServer | ForEach-Object {
$Printer = $_.Name
$Port = $_.PortName
Get-WmiObject Win32_TCPIpPrinterPort -ComputerName $PrintServer | where {$_.Name -eq $Port} |
select @{Name="PrinterName";Expression={$Printer}}, HostAddress
}
對於90%,可與該代碼中找到。但有時無法找到並且該字段保持空白,因爲Name
和PortName
之間沒有匹配。
是否有獲取該物業的作品時的100%的更好的辦法?
嗯。檢查哪些打印機沒有「HostAddress」填充,可能這些是基於軟件的打印機,如「Print to PDF」或類似的打印機。 – Vesper
建議Vesper,但我已經檢查過。這些打印機是普通的打印機,就像惠普和柯尼卡美能達那樣。在超過500臺打印機的列表中,我們只有12臺沒有「PortHostAddress」填充。同一臺服務器上相同品牌的其他打印機不存在此問題。很奇怪.. – DarkLite1
他們打印在任何地方嗎?他們是否分配了端口?如果不是IP_xxxx,那些端口的類型是什麼? (DOT_xxx,也許,這些使用WINS類型的名稱分辨率來查找打印機) – Vesper