Хост-адрес свойства порта принтера 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,

Другие вопросы по тегам