С помощью PowerShell можно автоматизировать типовые задачи управления принтерами и драйверами печати в Windows. В этой статье мы рассмотрим, как из консоли PowerShell создать, удалить или открыть общий доступ к принтеру, назначить принтер по-умолчанию; подключить сетевой принтер; установить или удалить драйвера принтера; управлять локальными портами и очередями печати.
Для управления подсистемой печати в Windows можно использовать встроенный PowerShell модуль PrintManagement. В этом модуле доступно 22 команды для управления принтерами:
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.
Установка драйвера печати в хранилище драйверов
Вывести список драйверов печати, который установлены в хранилище драйверов Windows:
Get-PrinterDriver
В модуле PrintManagement есть командлет Add—PrinterDriver, которые предполагает возможность установки драйвера из INF файла. Но фактически этот командлет позволяет добавить драйвера только в офлайн образ Windows (аналог Add-WindowsDriver, позволяющим интегрировать драйвера в оффлайн образ Windows).
Для установки драйвера печати из INF файла нужно использовать утилиту pnputil. Драйвера для нужной вам модели принтера нужно предварительно скачать с сайта разработчика и распаковать в локальную папку.
pnputil.exe -i -a "C:\drivers\KYOCERA\KyoClassicUniversalPCL6\OEMsetup.inf"
После того, как драйвер добавлен в хранилище драйверов, необходимо добавить его в список доступных принт-сервере.
Add-PrinterDriver -Name "Kyocera Classic Universaldriver PCL6"

Выведите список доступных драйверов печати:
Get-PrinterDriver
Установка принтера с помощью PowerShell
Перед тем как создать новый принтер, нужно создать порт печати. Это может быть локальный порт или сетевой порт (в случае печати на удаленный принтер по сети), Например:
Add-PrinterPort -Name "LocalPort:" -ErrorAction -Verbose
или
Add-PrinterPort -Name "IP_192.168.10.26" -PrinterHostAddress "192.168.10.26"
Чтобы создать новый принтер, нужно указать имя принтера, драйвер, и порт печати:
Add-Printer -Name "Ricoh IM 2702" -DriverName "Kyocera Classic Universaldriver PCL6" -PortName USB001 -Verbose
Проверьте, что новый принтер появился в панели управления.
Если нужно изменить имя принтера:
Rename-Printer -Name "Ricoh IM 2702" -NewName “Ricoh_2702"
Чтобы расшарить принтер по сети (открыть общий сетевой доступ к принтеру):
Set-Printer -Name "Ricoh IM 2702" -Shared $True -ShareName "Ricoh_2702"
Отключить общий доступ к принтеру:
Set-Printer -Name "Ricoh IM 2702" -Shared $False
Вывести список принтеров на сервере печати с помощью PowerShell
Вывести список принтеров, установленных на компьютере:
Get-Printer
Команда вернет имя принтера, тип (локальный или сетевой), драйвер, порт печати, открыт ли к принтеру общий доступ и опубликован ли принтер в AD.
Большинство командлетов модуля PrintManagement можно использовать для управления принтерами на удаленных компьютерах (с помощью параметра -ComputerName).
Вывести список принтеров, установленных на удаленном компьютере (принт-сервере):
Get-Printer -ComputerName msk-prnt1 | Format-List Name,DriverName
Вывести только принтера с общим доступом:
Get-Printer -ComputerName msk-prnt1 | where Shared -eq $true | fl Name
Вывести все принтеры с поддержкой дуплексной печати:
Get-Printer | ForEach-Object { Get-PrintConfiguration -PrinterName $_.Name } | Where-Object { $_.DuplexingMode -ne "OneSided" }
Вывести цветные принтеры:
Get-Printer | ForEach-Object { Get-PrintConfiguration -PrinterName $_.Name } | where {$_.Color -eq $True}
Включить цветной режим печати для принтера:
Get-Printer 'HP Color LaserJet 150nw' | Set-PrintConfiguration -Color $true
Подключить сетевой принтер из консоли PowerShell
Чтобы подключить сетевой принтер с сервера печати, выполните:
Add-Printer -ConnectionName \\msk-prnt1\HPCL3020
Вывести список подключенных на компьютере сетевых принтеров:
Get-Printer | ?{$_.type -eq 'Connection'}
Удалить конкретный сетевой принтер:
Get-Printer -name \\msk-prnt1\HPCL3020 | Remove-Printer -force
Удалить все подключенные сетевые принтеры на компьютере:
Get-Printer | ?{$_.type -eq 'Connection'} | Remove-Printer
Назначить принтер по-умолчанию
В Windows 10 и выше в качестве принтера по умолчанию назначается принтер, на котором пользователь успешно печатал последний раз. Чтобы Windows не переназначала принтера по-умолчанию, нужно создать в реестре параметр LegacyDefaultPrinterMode:
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name "LegacyDefaultPrinterMode" -Value 1 –Force
Назначить принтер по-умолчанию:
$Printer = Get-CimInstance -Class Win32_Printer -Filter "Name='Ricoh IM 2702'"
Invoke-CimMethod -InputObject $Printer -MethodName SetDefaultPrinter
Удаление принтера с помощью PowerShell
Чтобы удалить принтер, выполнить команду PowerShell:
Remove-Printer -Name "Ricoh IM 2702"
Затем можно удалить драйвер печати:
Remove-PrinterDriver -Name "Kyocera Classic Universaldriver PCL6"
В конце оставлю еще несколько полезных команд управления принтерами для системного администратора:
Отправить тестовую страницу на печать:
Invoke-CimMethod -MethodName printtestpage -InputObject (Get-CimInstance win32_printer | Where-Object Name -eq "HP LaserJet M1530 MFP Series PCL 6")
Очистить очередь печати принтера:
Get-Printer -Name "HP LaserJet M1530 MFP Series PCL 6" | Get-PrintJob | Remove-PrintJob
Здравствуйте , а можно как-то с помощью 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.
Это применимо к вашей среде?
Буду благодарен если поможете со скриптом powershell который удалит только локальные принтеры (все разом ) если возможно не затрагивая сетевые. Если не возможно то не страшно , можно все разом, политикой потом накинуться все не обходимые принтаки.
Подскажите, как добавить 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
Теперь можно работать с логами.
Огромное спасибо!!!
2Артем 09.11.2023
Удалить все локальные принтеры:
get-printer| where {$_.type -eq «Local»}| Remove-Printer
Это такжу удалит виртуальные принтеры, типа «Microsoft Print to PDF» и прочих. Но уж отфильтруйте из сами )
Создать порт, установить драйвер и подключить прнитер по IP:
$portIP = "192.168.x.x"
$printName = "..."
$printDriverName = "..."
$inf = "\\server\...\....inf"
$shell = New-Object -Com WScript.Shell
$portName = "IP_$portIP"
# DRIVERS
$cmd = "pnputil.exe -i -a ""$inf"""
iex $cmd
Add-PrinterDriver -Name $printDriverName
# Port
$portExists = Get-Printerport -Name $portname -ErrorAction SilentlyContinue
if (-not $portExists) {
Add-PrinterPort -name $portName -PrinterHostAddress $portIP
}
# Printer
$printDriverExists = Get-PrinterDriver -name $printDriverName -ErrorAction SilentlyContinue
if ($printDriverExists) {
Add-Printer -Name $printName -PortName $portName -DriverName $printDriverName
}else{
Write-Warning "Printer Driver not installed"
}
Можно ли управлять лотками ?
Имеете в виду задать лоток по умолчанию?
Как вариант можно экспортировать/применять настройки через XML файл:
$PrinterConfig=Get-PrintConfiguration -PrinterName "HP LaserJet M1530 MFP Series PCL 6"
$PrinterConfig.PrintTicketXML | out-file C:\ps\printsettings.xml
Применить настройки:
$PrintXml = Get-Content C:\ps\printsettings.xml | Out-String
Set-PrintConfiguration -PrinterName "HP LaserJet M1530 MFP Series PCL 6" -PrintTicketXml $PrintXml
Здравствуйте!
Почему-то при подключении к компу через Enter-Pssession, не выводится принтер по умолчанию и ещё кракозябры:
‘ҐаўҐа бжҐ аЁҐў Windows (Microsoft R) ўҐабЁп 5.812 Copyright (C) Љ®аЇ®а жЁп Њ ©Єа®б®дв 1996-2006, ўбҐ Їа ў § йЁйҐл.
ЭТо при подключении ко всем компам, наблюдается такая тенденция.
Проблема с русской кодировкой.
Решается:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
Или:
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251")
При выполнении этих команд на удалённых хостах, появляется ошибка:
Исключение при задании «OutputEncoding» : «Неверный дескриптор.
»
строка:1 знак:1
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
Спасибо, получилось!!!
как установить принтер сетевой со сканером?