none
Сбор данных по сетевым принтерам

    Вопрос

  • Есть задача, опросить сервер печати на параметры расшаренных принтеров и далее проверить сетевые принтера по адресу.

    Ранее я использовал такой фрагмент кода

    <# $PSlists - файл, где лежит перечень серверов $IPList - список принтеров на сервере #> $IPList = Get-Printer -ComputerName $PSlists

    $IPlist.portname


    Но к сожалению подтягиваются все принтеры, не только расшаренные. По этому решил воспользоваться таким запросом

    $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists

    Все отлично, в переменную $IPList.hostaddress заносились все подключенные сетевые принтеры в офисе(их IP). Но при вызове 

    $Ping = Test-NetConnection $IPList.hostaddress

    Посыпались ошибки 

    Test-NetConnection : Не удается обработать преобразование аргументов для параметра "ComputerName". Не удается преобразовать значение в тип System.String.

    Я попытался изменить команду

     $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists | Out-String
     

    И полезла ошибка

    Resolve-DnsName : Не удается проверить аргумент для параметра "Name". Аргумент пустой или имеет значение NULL. Укажите непустой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.

    При использовании такого кода, проблема осталась и текст ошибки не изменился

        $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists
        $IPList = [string] $IPList

    Понимаю что при выполнении 

    $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists

    Возникает проблема  типом данных, но вот как привести их в правильный вид не пойму. 


    4 декабря 2018 г. 14:29

Ответы

  • Мои комментарии начинаются с #?#
    $ReportDir = "\\SERVER\Report"
    $Date = Get-Date -UFormat "%d-%m-%Y"
    
    
    #СПИСОК СЕРВЕРОВ
    #?# Зачем вам CSV если вы не используете его функционал через Import-CSV ?
    $PSList =  @(Get-Content $ReportDir\PS_list.csv)	#список принтеров
    
    #?# Apple - яблоко (единственное число), apples - яблокИ (множественное число).
    #?# $PSlists - PS спискИ (единственное число как бы странно это не звучало)
    Foreach ($PSlists in $PSlist) {
    	#ЗАДАЕМ ПЕРЕМЕННЫЕ
        $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists
        #?# Предположу что $IPList может содержать более одного порта // У меня команда ничего не вернула
    
        #?# Зачем пересоздавать каталог столько раз сколько у вас серверов в списке? Вынесите команду в 3 строку
        New-Item -Path $ReportDir\LanPrinter -ItemType "directory" -ErrorAction SilentlyContinue | Out-Null
        Write-Host -ForegroundColor White -BackgroundColor DarkGreen "Сервер $PSlists"
        
        Foreach ($IPs in $IPList) {
    		#ОПРОС КАЖДОГО ПРИНТЕРА
            #?# Почему тут используете $IPList хотя это массив, а переменная в этом масиве называется $IPs?
    		$Ping = Test-NetConnection $IPList.hostaddress -ErrorAction Continue -WarningAction SilentlyContinue
            #?# Тоже самое тут: $($IPs.Name) но почему то $($IPList.hostaddress)
            $PingOK = "Принтер $($IPs.Name) ($($IPList.hostaddress)) ДОСТУПЕН" 
            #?#  -//-
            $PingFail = "!!! Принтер $($IPs.Name) ($($IPList.hostaddress)) НЕ ДОСТУПЕН"
    
    		if ($ping.PingSucceeded -eq "True") {
               Write-Host "$PingOK" -ForegroundColor Green
               $PingOK >> $ReportDir\LanPrinter\$Date.log
            }
    		else { 
    			Write-Host "$PingFail" -ForegroundColor Red -BackgroundColor Black
                $PingFAIL >> $ReportDir\LanPrinter\$Date.log
                $PingFAIL >> $ReportDir\LanPrinter\$Date_FAIL_$PSlists.log
            }
    	} 
    }
    PS Обратите внимание что преобразование типов я удалил так как оно не нужно

    The opinion expressed by me is not an official position of Microsoft


    4 декабря 2018 г. 21:00
    Модератор

Все ответы

  • Вы массив приводите к типу строка что не верно. Используйте foreach для перебора элементов масива и именно для них (элементов), по одному проверяйте доступность

    The opinion expressed by me is not an official position of Microsoft

    4 декабря 2018 г. 14:41
    Модератор
  • Я привел лишь кусок кода. Foreach я использую. Вот весь код

    $ReportDir = "\\SERVER\Report"
    $Date = Get-Date -UFormat "%d-%m-%Y"
    
    
    #СПИСОК СЕРВЕРОВ
    $PSList =  @(Get-Content $ReportDir\PS_list.csv)	#список принтеров
    
    Foreach ($PSlists in $PSlist) {
    	#ЗАДАЕМ ПЕРЕМЕННЫЕ
        $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists
        $IPList = [string] $IPList
    
        New-Item -Path $ReportDir\LanPrinter -ItemType "directory" -ErrorAction SilentlyContinue | Out-Null
        Write-Host -ForegroundColor White -BackgroundColor DarkGreen "Сервер $PSlists"
        
        Foreach ($IPs in $IPList) {
    		#ОПРОС КАЖДОГО ПРИНТЕРА
    		$Ping = Test-NetConnection $IPList.hostaddress -ErrorAction Continue -WarningAction SilentlyContinue
            $PingOK = "Принтер $($IPs.Name) ($($IPList.hostaddress)) ДОСТУПЕН" 
            $PingFail = "!!! Принтер $($IPs.Name) ($($IPList.hostaddress)) НЕ ДОСТУПЕН"
    
    		if ($ping.PingSucceeded -eq "True") {
               Write-Host "$PingOK" -ForegroundColor Green
               $PingOK >> $ReportDir\LanPrinter\$Date.log
               
            }
    		else { 
    			Write-Host "$PingFail" -ForegroundColor Red -BackgroundColor Black
                $PingFAIL >> $ReportDir\LanPrinter\$Date.log
                $PingFAIL >> $ReportDir\LanPrinter\$Date_FAIL_$PSlists.log
            }
    	} 
    }
           

    Проблема началась когда я захотел использовать 

    $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists

    Вместо

    $IPList = Get-Printer -ComputerName $PSlists

    4 декабря 2018 г. 14:49
  • Мои комментарии начинаются с #?#
    $ReportDir = "\\SERVER\Report"
    $Date = Get-Date -UFormat "%d-%m-%Y"
    
    
    #СПИСОК СЕРВЕРОВ
    #?# Зачем вам CSV если вы не используете его функционал через Import-CSV ?
    $PSList =  @(Get-Content $ReportDir\PS_list.csv)	#список принтеров
    
    #?# Apple - яблоко (единственное число), apples - яблокИ (множественное число).
    #?# $PSlists - PS спискИ (единственное число как бы странно это не звучало)
    Foreach ($PSlists in $PSlist) {
    	#ЗАДАЕМ ПЕРЕМЕННЫЕ
        $IPList = Get-WmiObject -Class Win32_TCPIPPrinterPort -computername $PSlists
        #?# Предположу что $IPList может содержать более одного порта // У меня команда ничего не вернула
    
        #?# Зачем пересоздавать каталог столько раз сколько у вас серверов в списке? Вынесите команду в 3 строку
        New-Item -Path $ReportDir\LanPrinter -ItemType "directory" -ErrorAction SilentlyContinue | Out-Null
        Write-Host -ForegroundColor White -BackgroundColor DarkGreen "Сервер $PSlists"
        
        Foreach ($IPs in $IPList) {
    		#ОПРОС КАЖДОГО ПРИНТЕРА
            #?# Почему тут используете $IPList хотя это массив, а переменная в этом масиве называется $IPs?
    		$Ping = Test-NetConnection $IPList.hostaddress -ErrorAction Continue -WarningAction SilentlyContinue
            #?# Тоже самое тут: $($IPs.Name) но почему то $($IPList.hostaddress)
            $PingOK = "Принтер $($IPs.Name) ($($IPList.hostaddress)) ДОСТУПЕН" 
            #?#  -//-
            $PingFail = "!!! Принтер $($IPs.Name) ($($IPList.hostaddress)) НЕ ДОСТУПЕН"
    
    		if ($ping.PingSucceeded -eq "True") {
               Write-Host "$PingOK" -ForegroundColor Green
               $PingOK >> $ReportDir\LanPrinter\$Date.log
            }
    		else { 
    			Write-Host "$PingFail" -ForegroundColor Red -BackgroundColor Black
                $PingFAIL >> $ReportDir\LanPrinter\$Date.log
                $PingFAIL >> $ReportDir\LanPrinter\$Date_FAIL_$PSlists.log
            }
    	} 
    }
    PS Обратите внимание что преобразование типов я удалил так как оно не нужно

    The opinion expressed by me is not an official position of Microsoft


    4 декабря 2018 г. 21:00
    Модератор
  • Михаил, как ваши успехи?

    The opinion expressed by me is not an official position of Microsoft

    5 декабря 2018 г. 19:05
    Модератор