В предыдущей статье мы рассмотрели олдскульные vbs скрипты, которые можно было использовать для управления принтерами и печатью во всех версиях Windows, начиная с Windows XP. Сегодня же мы рассмотрим типовые команды для создания, удаления принтеров, портов и драйверов печати в Windows при помощи PowerShell. Рассмотренные методы управления принтерами можно использовать в современных ОС — Windows 10, 8.1 и Windows Server 2012 R2 / 2016 / 2019.
Модуль PowerShell: PrintManagement
Вместе с выходом Windows 8.1 и Windows Server 2012 R2 Microsoft выпустила новую версию PowerShell 4.0 (входит в состав Windows Management Framework 4.0), в котором был существенно расширен список командлетов по управлению сервером печати на базе Windows. Полный список командлетов, по управлению принтерами, драйверами и очередями печати, доступных в модуле PrintManagement на Windows 10 (PoSh v5) можно вывести командой:
Get-Command –Module PrintManagement

В модуле PrintManagement доступны 22 командлета PowerShell для управления принтерами, драйверами, портами печати и очередями:
- Add-Printer – добавить (установить) новый принтер;
- Add-PrinterDriver — установить новый драйвер печати;
- Add-PrinterPort – создать порт печати;
- Get-PrintConfiguration – вывести настройки печати принтера;
- Get-Printer – вывести список принтеров, установленных на компьютере;
- Get-PrinterDriver – вывести список установленных драйверов печати;
- Get-PrinterPort — вывести список портов печати;
- Get-PrinterProperty – показать свойства принтера;
- Get-PrintJob – получить список заданий печати принтера;
- Read-PrinterNfcTag – получить информацию о принтере из NFC метки;
- Remove-Printer — удалить принтер;
- Remove-PrinterDriver — удалить драйвер принтера;
- Remove-PrinterPort — удалить порт принтера;
- Remove-PrintJob – удалить задание печати на принтере;
- Rename-Printer — переименовать принтер;
- Restart-PrintJob — перезапустить задание печати;
- Resume-PrintJob — запустить приостановленное задание
- Set-PrintConfiguration – настройка конфигурации принтера;
- Set-Printer – обновить конфигурацию принтера;
- Set-PrinterProperty — изменить свойства принтера;
- Suspend-PrintJob – приостановить выполнение задания печати;
- Write-PrinterNfcTag – записать информацию в метку NFC.
Подробную информацию о синтаксисе конкретной команды можно получить так:
Get-Help <имя_командлета > -Detailed
Примеры использования команд:
Get-Help <имя_командлета > -Examples
Рассмотрим несколько примеров типовых сценариев управления принтерами в Windows 10 из PowerShell.
Установка драйвера печати в хранилище драйверов
Чтобы вывести список драйверов печати, который установлены в хранилище драйверов Windows:
Get-PrinterDriver
Уставим в системе новый драйвер печати, например, HP Universal Printing PCL 6. Согласно документации, команда PowerShell для добавления драйвера должна быть такой:
Add-PrinterDriver -Name "HP Universal Printing PCL 6" -InfPath "C:\Distr\HP-pcl6-x64\hpcu118u.inf"
Однако при попытке установить драйвер подобным образом появляется ошибка:
Add-PrinterDriver : One or more specified parameters for this operation has an invalid value. At line:1 char:1 + Add-PrinterDriver -Name "HP Universal Printing PCL 6" -InfPath "C:\Di ... + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (MSFT_PrinterDriver:ROOT/StandardCimv2/MSFT_PrinterDriver) [Add-PrinterDriver], CimException + FullyQualifiedErrorId : HRESULT 0x80070057,Add-PrinterDriver
Оказывается, драйвер из inf файла можно добавить только в том случае, если он уже находится в хранилище драйверов DriverStore (подробнее про хранилище можно почитать здесь). Получается, что с помощью команды Add-PrinterDriver установить драйвер, отсутствующий в хранилище драйверов системы нельзя. Для установки драйвера в DriverStore можно воспользоваться:
- vbs скриптом из предыдущей статьи;
- Утилитой pnputil.exe. Формат такой:
pnputil.exe -i -a C:\Distr\HP-pcl6-x64\hpcu118u.inf
(установить конкретный драйвер принтера) илиpnputil.exe -i -a C:\Distr\HP-pcl6-x64\*.inf
(установит все драйвера, найденные в inf файлах указанного каталога); - Командлетом Add-WindowsDriver, позволяющим интегрировать драйвера в оффлайн образ Windows.
После добавления драйвер принтера в хранилище, необходимо добавить его в список доступных принт-сервере.
Add-PrinterDriver -Name "HP Universal Printing PCL 6"

Установка нового принтера с помощью PowerShell
Создадим ip порт для печати на сетевом принтере (тут можно указать как IP адрес сетевого принтера, так и имя удаленного принт-сервера):
Add-PrinterPort -Name "IP_192.168.10.26" -PrinterHostAddress "192.168.10.26"
Перед добавлением порта вы можете проверить, существует ли он:
$portName = "IP_192.168.10.26"
$checkPortExists = Get-Printerport -Name $portname -ErrorAction SilentlyContinue
if (-not $checkPortExists) {
Add-PrinterPort -name $portName -PrinterHostAddress "192.168.10.26"
}
С помощью следующей команды мы создадим в системе новый принтер и опубликуем его (откроем к нему общий доступ):
Add-Printer -Name hp2050_Office1_Buh -DriverName "HP Deskjet 2050 J510 series Class Driver" -PortName IP_192.168.10.26 -Shared -ShareName "hp2050_1_BUh" –Published

Чтобы переименовать принтер достаточно выполнить команду:
Rename-Printer -Name "hp2050_Office1_Buh" -NewName " hp2050_Salary"
После выполнения указанных команд в системе появится новый принтер с общим доступом под именем hp2050_Office1_Buh.
Вывод списка принтеров на сервере печати с помощью PowerShell
Выведем полный список принтеров, установленных на данном компьютере:
Get-Printer
Как вы видите, команда показывает имя принтера, тип (локальный или сетевой), драйвер, порт печати, открыт ли к принтеру общий доступ и опубликован ли принтер в AD.
Большинство командлетов модуля PrintManagement можно использовать для просмотра состояния и управления принетрами, драйверами и очередями печати на удаленных компьютерах. Имя удаленного компьютера или сервера указывается в качестве аргумента параметра –ComputerName.
С помощью PowerShell вы можете получить информацию об установленных принтерах на удаленном компьютере (принт-сервере), для этого выполните команду:
Get-Printer -ComputerName msk-prnt1 | Format-List Name,DriverName
Чтобы вывести только список принтеров с общим доступом, используйте команду:
Get-Printer -ComputerName msk-prnt1 | where Shared -eq $true | fl Name
Подключение сетевого принтера из PowerShell
Чтобы подключить принтер с сервера печати, используйте команду:
Add-Printer -ConnectionName \\msk-prnt1\HPCL3020
Windows 10 использует последний принтер, на который выполнялась печать в качестве принтера по умолчанию, если вы хотите использовать фиксированный принтер по-умолчанию, выполните команду:
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name "LegacyDefaultPrinterMode" -Value 1 –Force
Чтобы установить принтер по-умолчанию используйте следующие команды:
$wsnObj = New-Object -COM WScript.Network
$wsnObj.SetDefaultPrinter(%PrinterName%)
Удаление принтера с помощью PowerShell
Чтобы удалить принтер, нужно выполнить такую команду PowerShell:
Remove-Printer -Name "hp2050_Office1_Buh"
Вы можете удалить конкретный драйвер при помощи командлета Remove-PrinterDriver:
Remove-PrinterDriver -Name "HP Universal Printing PCL 6"
Здравствуйте , а можно как-то с помощью powershell выгрузить данные принтера (Имя, ИП, драйвер) по типу команды с пользователями АД:
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | select Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:\temp\user-password-expires-2019.csv -Append -Encoding UTF8
Имеете в виду уделенно? Из ad можно получить только инфу по опубликованным принтерам.
Если очень нужно можно сделать выборку по всем компьютерам с помощью Get-AdComputer (https://winitpro.ru/index.php/2015/09/28/powershell-get-adcomputer-poluchenie-dannyx-o-kompyuterax-v-active-directory/) и для каждого компьютера вывести инфу о принтерах. Типа такого:
$Computers = Get-ADComputer -Filter {OperatingSystem -like '*Windows 10*'}
Foreach ($Computer in $Computers)
{
Get-Printer -ComputerName $Computer.Name | Format-List Name,DriverName
}
Добрый день! Была бы полезна инфа, если она есть, как удалить сетевой принтер (без принт-сервера) установленный пользователям вручную? Например поставили мы сто лет назад принтер, воткнули в сеть, а дальше как делал предыдущий адми, просто подходил к нужному пользователю и по айпишнику устанавливал ему этот принтер, скачивая драйвера. Так вот, сейчас мы развернули принтсервер и хотим все через него и ГПО раскинуть. А один из принтеров, который был установлен вручную удалить, но ходить к каждому и удалять не вариант, их +100500. Буду благодарен если подскажете метод более легкий
Я бы сделал логон скрипт в GPO, который бы просто разово удалил все локальные принтеры на компьютере (через powershell или vbs). А потом принтеры бы ставились только через GPO.
Это применимо к вашей среде?
Подскажите, как добавить LPR порт, который работает через LPD-сервер ? Средствами posh
Добрый день!
Подскажите, пожалуйста, как можно через powershell или может другие средства собрать общее количество распечатанных страниц локального принтера на удаленном компьютере? Например на принтере hp 1020
С сетевого принтера HP можно снять статистику через SNMP:
Полный список всех счетчиков:
snmpwalk -v 1 -c public 192.168.1.15
Затем проверяем количество напечатанных страниц (счетчик 1.3.6.1.2.1.43.10.2.1.4.1.1)
snmpget -v 2c -c public 192.168.1.15 1.3.6.1.2.1.43.10.2.1.4.1.1
$checkPortExists = Get-Printerport -Name $portname -ErrorAction SilentlyContinue — подскажите по этой команде по этой команде, в справке ни чего по этому параметру нету -ErrorAction и эта команда ни чего не возвращает
Тупанул, на счет параметра но толка все равно от проверки нет, побывал на не существующем порту все равно добавляет
Подскажите как сменить порт действующего принтера ?
попробуйте как-то так:
Add-PrinterPort -Name «IP_192.168.10.26» -PrinterHostAddress «192.168.10.26»
Set-Printer -name «yourprinter» -PortName «IP_192.168.10.26»
или если просто сменить IP адрес порта принтера:
$a=Get-Printer | where-object {$_.portname -eq "oldip"}
$a.PortName="newip"
set-printer -InputObject $a
Включить/отключить общий доступ к принетеру, задать имя:
Set-Printer -Name "printer name" -Shared $True|$False -ShareName "share name"
А можно как-то из powershell проверить наличие драйвера в хранилище драйверов DriverStore?
Get-WindowsDriver -Online
А как получить список принетров на удаленном компьютере, если принтеры устанавливаются для текущего пользователя? Локальные нет проблем, легко, а сетевые? Как получить спиоск всех принтеров, включая сетевые, установленные на удаленном компьютере из учетной записиси текущей сессии?
Проверьте, есть ли подключенные принтеры в реестре пользователя (укажите его SID):
Get-ChildItem Registry::\HKEY_Users\S-1-5-21-489056535-1467421822-2524099697-500\Printers\Connections
Если на компьютере настроен WinRM, можно получиь список подключенных принтеров для всех пользователей из реестра:
param (
[string]$Comp = "localhost"
)
function ListAllPrinters {
param (
[string]$Comp
)
Invoke-Command -ComputerName $Comp -ScriptBlock {
Get-ChildItem Registry::\HKEY_Users |
Where-Object { $_.PSChildName -NotMatch ".DEFAULT|S-1-5-18|S-1-5-19|S-1-5-20|_Classes" } |
Select-Object -ExpandProperty PSChildName |
ForEach-Object { Get-ChildItem Registry::\HKEY_Users\$_\Printers\Connections -Recurse | Select-Object -ExpandProperty Name }
}
}
# Main
ListAllPrinters $Comp
Спасибо за обстоятельный ответ. Служба WinRM отключена в нашей сети. Не хотелось бы нарушать текущие настройки доменной политики.
Добрый день.
Реализовал автоматическую печать входящих файлов, но произошла ситуация, что в логе записано: «Выполняю печать….», а на сервере нет такого задания…
А можно как-то узнать статус печати файла? (Success или нет).
WriteLog_GO "Начало процесса"
$args = ('/s '+ "C:\Users\kadaev\Desktop\PrintToPdf\Keocera3\Temp\$($xx)"+" \\msk-prn01\KkKyocera3_MyQ"+' /csv')
Start-Process C:\PDFtoPrinter\PDFtoPrinter.exe -Wait -WindowStyle Hidden -ArgumentList $args | WriteLog_GO "Выполняю печать файла $($xx) на Kyocera3_MyQ "
}
WriteLog_GO "Конец процесса"
С учетом того, что вы отправляете на печать из сторонеего прцесса — наверно проще всего отслеживать статус заданий печати по журналу событий Microsoft-Windows-PrintService/Operational
Думал отслеживать там, но там не отображается имя файла, а следовательно не возможно проследить какой файл напечатался (нет возможности писать корректный лог).
В моем случае это не подходит, потому что печатается одновременно с 5 филиалов.
Печатаю со стороннего процесса,(программы) только потому, что не нашел, откуда можно печатать пдф файлы, чтобы была возможность указать на какой принтер. (А функции powershell из интернета, вроде бы не совсем корректно работают с pdf).
Если подскажите, как можно легко воспроизводить печать pdf на PS, буду очень признателен.
Нет, не сталкивался.
Попробуйте включить политику Allow job name in event logs в Computer Configuration\Administrative Templates\Printers и посмотреть, будет ли отображаться имя напечатанного файла в событии.
Воо, замечательно.
Теперь в просмотре событий: в указывается название файла.
currency-payment-55125475.pdf
Теперь можно работать с логами.
Огромное спасибо!!!