PowerShell 打印机端口 属性 主机地址并不总是填充
PowerShell Printer port property hostaddress not always populated
我们正在尝试创建打印服务器上所有打印机的列表,以及它们各自使用的共享端口 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
)并不总是被填充。
下面的代码也说明了这一点,因为并非所有打印机都在输出中:
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% 的打印机,HostAddress
可以通过此代码找到。但有时找不到它并且该字段保持为空,因为 Name
和 PortName
.
之间没有匹配项
是否有更好的方法来检索这个 属性 100% 有效的方法?
由于附加数据表明问题端口使用的驱动程序与 Microsoft 的 TCP/IP 打印机端口驱动程序不同,解析这些端口的地址需要与驱动程序交互,这取决于有问题的驱动程序。所以跳过它,或者如果可能的话将远程端口转换为 Microsoft 的 "Standard TCP/IP port"。 HP 打印机很容易转换,WSD 打印机可以通过使用 WSD 打印机的 IP 地址创建一个 TCP/IP 端口并在该打印机上分配静态 IP 地址来转换,大约相同的过程可以用于 "Advanced TCP/IP port"s。标记为 "Local" 端口的端口是基于软件的,您可以使用主机的 IP 地址代替丢失的 PortHostAddress
.
我们正在尝试创建打印服务器上所有打印机的列表,以及它们各自使用的共享端口 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
)并不总是被填充。
下面的代码也说明了这一点,因为并非所有打印机都在输出中:
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% 的打印机,HostAddress
可以通过此代码找到。但有时找不到它并且该字段保持为空,因为 Name
和 PortName
.
是否有更好的方法来检索这个 属性 100% 有效的方法?
由于附加数据表明问题端口使用的驱动程序与 Microsoft 的 TCP/IP 打印机端口驱动程序不同,解析这些端口的地址需要与驱动程序交互,这取决于有问题的驱动程序。所以跳过它,或者如果可能的话将远程端口转换为 Microsoft 的 "Standard TCP/IP port"。 HP 打印机很容易转换,WSD 打印机可以通过使用 WSD 打印机的 IP 地址创建一个 TCP/IP 端口并在该打印机上分配静态 IP 地址来转换,大约相同的过程可以用于 "Advanced TCP/IP port"s。标记为 "Local" 端口的端口是基于软件的,您可以使用主机的 IP 地址代替丢失的 PortHostAddress
.