Статья посвящена работе с удаленными сетевыми принтерами и продолжает первую часть заметки: «Работа с драйверами принтера. Часть 1».
Ниже собраны команды и приемы, которые удобно использовать как рабочую шпаргалку: от проверки сервера печати и массового добавления драйверов в репозиторий удаленных ПК до установки, удаления и назначения принтера по умолчанию.
Проверяем доступ к серверу печати на удаленном ПК
Перед тем как пытаться создавать порты и подключать принтеры на удаленном компьютере, рекомендую сначала проверить, открываются ли свойства сервера печати на этом ПК:
rundll32 printui.dll,PrintUIEntry /s /c \ROND0042
Если команда возвращает ошибку, то на практике причиной может оказаться отсутствие хотя бы одного расшаренного принтера на удаленном компьютере. После открытия общего доступа хотя бы для одного принтера окно свойств сервера печати начинает открываться. Причем последующее отключение общего доступа повторно ошибку не вызывает.
С чем связано такое поведение, я пока не разобрался. Сравнение параметров безопасности для серверов печати с доступом и без отличий не показало, то есть причина, по крайней мере в моем случае, оказалась не в них.
Массовое добавление драйвера в репозиторий удаленных ПК
В первой части я писал, что удобно хранить подготовленные драйверы на сетевом ресурсе и по мере необходимости добавлять их в репозиторий компьютеров. Ниже пример такой схемы: каталог с драйвером копируется на удаленный ПК по административному ресурсу, после чего сам драйвер импортируется в DriverStore при помощи PNPUtil и PsExec.
$Computers = 'ROND0042','ROND0043'
$DriverSource = '\msk-bkp01Xerox3325PCLWin7x64PCL'
$PsExec = "$PSScriptRootPsExec.exe"
foreach($Computer in $Computers){
$RemoteSharePath = "\$ComputerC$TempXerox3325PCLWin7x64"
New-Item $RemoteSharePath -ItemType Directory -Force | Out-Null
Copy-Item "$DriverSource*" $RemoteSharePath -Recurse -Force
& $PsExec "\$Computer" -h -accepteula pnputil.exe -i -a "C:TempXerox3325PCLWin7x64sxr3m.inf"
}
После успешного добавления драйвера в репозиторий систему уже можно заставить установить принтер автоматически, не указывая каждый раз путь к исходным файлам вручную.
Установка принтера на удаленном компьютере
Создаем порт
Перед добавлением принтера обязательно должен быть создан порт. Сделать это можно разными способами:
- С помощью стандартного VBS скрипта
cscript.exe %systemroot%System32Printing_Admin_Scriptsru-RUprnport.vbs -s \ROND0042 -a -r 192.168.27.203 -h 192.168.27.203 -o RAW
- Командлетом PowerShell из модуля PrintManagement
Add-PrinterPort -ComputerName rond0042 -Name 192.168.27.203 -PrinterHostAddress 192.168.27.203
- Через WMI, как в скрипте в конце статьи
Подключаем принтер
Установку можно выполнить через GUI, PrintUIEntry, PowerShell или стандартные VBS-скрипты.
Удаленная установка через GUI
rundll32 printui.dll,PrintUIEntry /im /c \ROND0042
PrintUIEntry
rundll32 printui.dll,PrintUIEntry /c \ROND0042 /if /n "WorkCentre 3325" /b "WorkCentre 3325" /m "Xerox WorkCentre 3325" /f "\msk-bkp01Xerox3325PCLWin7x64PCLsxr3m.inf" /r "192.168.27.202"
PowerShell
Add-Printer -ComputerName ROND0042 -PortName 192.168.27.202 -DriverName "Xerox WorkCentre 3325" -Name "Xerox WorkCentre 3325"
Скрипт VBS
cscript.exe %systemroot%System32Printing_Admin_Scriptsru-RUprnmngr.vbs -s \ROND0042 -a -p "Xerox WorkCentre 3325" -m "Xerox WorkCentre 3325" -r 192.168.27.202
Удаление принтера на удаленном компьютере
Через PrintUIEntry можно удалять и сам принтер, и его драйвер.
Ключ /dd удаляет драйвер принтера:
rundll32 printui.dll,PrintUIEntry /dd /c \ROND0042 /m "Xerox WorkCentre 3220 PS" /h "x64"
Ключ /dl удаляет объект принтера с компьютера:
rundll32.exe printui.dll,PrintUIEntry /dl /n "\ROND0042Xerox WorkCentre 3325"
При необходимости ключи можно комбинировать в одной команде.
Скрипт VBS
cscript.exe %systemroot%System32Printing_Admin_Scriptsru-RUprnmngr.vbs -s \ROND0042 -p "Xerox WorkCentre 3325" -d
Через WMI
$NetPrinter = gcim Win32_Printer | ? Name -like "*\**" | Select -ExpandProperty Name
$net = New-Object -ComObject "Wscript.Network"
$net.RemovePrinterConnection("$NetPrinter")
Через PowerShell
Remove-Printer -ComputerName ROND0042 -Name "Xerox WorkCentre 3325" Remove-PrinterDriver -ComputerName ROND0042 -Name "Xerox WorkCentre 3325"
Назначение принтера по умолчанию
Для PrintUIEntry принтер по умолчанию задается ключом /y:
rundll32 printui.dll,PrintUIEntry "\ROND0042Xerox WorkCentre 3325" /y
WMI / COM
(New-Object -ComObject WScript.Network).SetDefaultPrinter("Xerox WorkCentre 3325")
VBS
cscript.exe %systemroot%System32Printing_Admin_Scriptsru-RUprnmngr.vbs -s \ROND0042 -t -p "ECOSYS P3055dn"
Установка принтера PowerShell-скриптом
Ниже пример полного скрипта, который создает TCP/IP-порт, подключает принтер и делает его принтером по умолчанию:
$ip = '192.168.27.201'
# Как принтер будет называться в системе
$name = "ECOSYS P3055dn"
$IPPortName = $ip
# Путь к драйверу
$DriverPath = "\msk-bkp01DriversKyocera3055Win7x64"
$DriverInf = (dir $DriverPath -Filter '*.inf').FullName
# Установка порта
$port = [WMICLASS]"Win32_TcpIpPrinterPort"
$port.psbase.scope.options.EnablePrivileges = $true
$newPort = $port.CreateInstance()
$newPort.name = $IPPortName
$newPort.Protocol = 1
$newPort.HostAddress = $ip
$newPort.SnmpEnabled = $false
$newPort.Put()
# Имя драйвера можно посмотреть в inf-файле драйвера
$DriverName = 'Kyocera ECOSYS P3055dn KX'
# Подключаем сетевой принтер с установкой драйвера
rundll32 printui.dll,PrintUIEntry /if /n $name /b $name /f $DriverInf /r $ip /m $DriverName
# Ожидаем появления принтера в системе
while( !((New-Object -ComObject WScript.Network).EnumPrinterConnections() | ?{ $_ -match $name }) ){ Start-Sleep 7 }
# Назначаем принтер по умолчанию
(New-Object -ComObject WScript.Network).SetDefaultPrinter($name)
Таким образом, вся схема сводится к трем шагам: подготовить драйвер, добавить его в репозиторий удаленного ПК и затем любым удобным способом создать порт и подключить принтер. Если драйвер уже находится в DriverStore, дальнейшая установка обычно проходит заметно быстрее и без ручного выбора файлов.
