2015-07-03 5 views
0

Мы пытаемся создать список всех принтеров на сервере печати с соответствующими HostAddress для общего порта, который они используют. Для этого мы создали следующую функцию:Узел порта принтера PowerShell не всегда заполнен

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

Хм. Проверьте, что на принтерах нет «HostAddress», возможно, это программные принтеры, такие как «Печать в PDF» или аналогичные. – Vesper

+0

Твердый советский Веспер, но я это уже проверил. Эти принтеры - обычные принтеры, например, HP и Konica Minolta. В списке из более чем 500 принтеров у нас всего 12, у которых нет «PortHostAddress». Другие принтеры одних и тех же марок на одном сервере не имеют этой проблемы. Очень странно .. – DarkLite1

+1

Печать в любом месте? У них есть порты? Каковы типы этих портов, если не IP_xxxx? (DOT_xxx, возможно, они используют разрешение имен типа WINS для поиска принтера) – Vesper

ответ

1

Поскольку дополнительные данные указывают, что в портах проблем используются драйверы, отличные от драйвера порта принтера TCP/IP от Microsoft, разбор адресов этих портов потребует взаимодействия с драйверами, это зависит от соответствующего драйвера. Поэтому пропустите его или конвертируйте удаленный порт в «Стандартный порт TCP/IP» Microsoft, если это возможно. Принтеры HP легко конвертируются, WSD-принтеры могут быть преобразованы путем создания порта TCP/IP с IP-адресом WSD-принтера и назначения статического IP-адреса на этом принтере, и примерно такая же процедура может работать с «Расширенным портом TCP/IP «s. Порты, помеченные как «Локальные» порты, основаны на программном обеспечении, и вы можете использовать IP-адрес хоста вместо пропущенных PortHostAddress.