Хост-адрес свойства порта принтера 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
в функции выше) не всегда заселяется.
Это также иллюстрируется следующим кодом, так как не все принтеры находятся в выводе:
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% случаев?
1 ответ
Поскольку в дополнительных данных указывается, что проблемные порты используют драйверы, отличные от драйвера порта принтера TCP/IP от Microsoft, анализ адресов этих портов потребует взаимодействия с драйверами, это зависит от рассматриваемого драйвера. Поэтому пропустите его или конвертируйте удаленный порт в "стандартный порт TCP/IP", если это возможно. Принтеры HP легко конвертируются, принтеры WSD можно конвертировать, создав порт TCP/IP с IP-адресом принтера WSD и назначив статический IP-адрес этому принтеру, и примерно такая же процедура может работать с "Расширенным портом TCP/IP". "s. Порты с пометкой "Локальные" являются программными, и вы можете использовать IP-адрес хоста вместо пропущенных. PortHostAddress
,