我们正在尝试创建打印服务器上所有打印机的列表,其中各自的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%的时间内都有效?
答案 0 :(得分:1)
由于附加数据表明问题端口使用的驱动程序与Microsoft的TCP / IP打印机端口驱动程序不同,因此解析这些端口的地址需要与驱动程序进行交互,这取决于所讨论的驱动程序。因此,如果可能的话,跳过它,或将远程端口转换为Microsoft的“标准TCP / IP端口”。 HP打印机很容易转换,WSD打印机可以通过创建一个带有WSD打印机IP地址的TCP / IP端口并在该打印机上分配静态IP地址进行转换,大约相同的程序可以使用“高级TCP / IP端口” “S。标记为“本地”端口的端口是基于软件的,您可以使用主机的IP地址代替丢失的PortHostAddress
。