2015-07-03 19 views
0

我們試圖建立一個打印服務器上的所有打印機的列表以及它們各自HostAddress他們所使用的共享端口。要做到這一點,我們創建了以下功能: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)的屬性並不總是被填充。

這也用下面的代碼說明,因爲不是所有的打印機在輸出:所有打印機的HostAddress

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%,可與該代碼中找到。但有時無法找到並且該字段保持空白,因爲NamePortName之間沒有匹配。

是否有獲取該物業的作品時的100%的更好的辦法?

+0

嗯。檢查哪些打印機沒有「HostAddress」填充,可能這些是基於軟件的打印機,如「Print to PDF」或類似的打印機。 – Vesper

+0

建議Vesper,但我已經檢查過。這些打印機是普通的打印機,就像惠普和柯尼卡美能達那樣。在超過500臺打印機的列表中,我們只有12臺沒有「PortHostAddress」填充。同一臺服務器上相同品牌的其他打印機不存在此問題。很奇怪.. – DarkLite1

+1

他們打印在任何地方嗎?他們是否分配了端口?如果不是IP_xxxx,那些端口的類型是什麼? (DOT_xxx,也許,這些使用WINS類型的名稱分辨率來查找打印機) – Vesper

回答

1

由於額外的數據指出了問題的端口使用來自微軟的TCP/IP打印機端口驅動不同的驅動程序,解析這些端口的地址將需要與驅動程序進行交互,這是依賴於有問題的驅動程序。因此,如果可能,請跳過它,或將遠程端口轉換爲Microsoft的「標準TCP/IP端口」。惠普打印機很容易轉換,WSD打印機可以通過創建帶有WSD打印機的IP地址的TCP/IP端口並在該打印機上分配靜態IP地址進行轉換,並且大約相同的步驟可以與「高級TCP/IP端口「S。標有「本地」端口的端口是基於軟件的,您可以使用主機的IP地址代替錯過的PortHostAddress