Окончание драйверов принтера Windows ── как готовить печать форм и этикеток в бизнес-приложениях
· Обновлено: · Го Комура · Windows, Разработка для Windows, Windows 11, CSharp, .NET, WinForms, WPF, Печать, Формы, Драйвер принтера, IPP, Эксплуатация, Техническая консультация
История изменений (первая версия, опубликована 1 Sep 2026)
- Первая публикация
«Поставили новый ПК — тот же принтер, а выбор бумаги и лотков другой.» «Сохранённые настройки печати не возвращаются.» «Принтер этикеток пропал из списка.» Готовиться к окончанию сопровождения драйверов принтера — сделать так, чтобы при таких изменениях работа не останавливалась.
Сначала зафиксируйте: план окончания сопровождения драйверов и включение Windows protected print mode — разное. Дата плана сама по себе существующую печать разом не остановит. Зато в сценах, где меняется выбор драйвера или включают Windows protected print mode, настройки и назначение, от которых зависело приложение, теряются.12
Статья для разработчиков, которые сопровождают Windows-бизнес-приложения WinForms и WPF, и администраторов, которые разворачивают принтеры: что меняется, что смотреть, где править, как проверять. Выбор самих API печати и способа вывода PDF — в предыдущей Печать и PDF в Windows-приложениях: PrintDocument, WPF и библиотеки отчётов.
Исходная среда — Windows 11 (проверка WPP — 24H2 и новее), PowerShell 5.1 и новее (модуль PrintManagement), C# (.NET 6 и новее или .NET Framework 4.x, System.Drawing.Printing / System.Printing). Сложность — средняя.
1. Сначала выводы
Код печати не переписывают оптом: сначала подтверждают, «останется ли назначение», и уже потом правят места зависимости от драйвера.
Порядок решения — три ступени.
| Порядок | Что подтвердить | Следующее действие |
|---|---|---|
| 1. Назначение печати | Останется ли очередь при WPP. Можно ли физический принтер зарегистрировать заново через Windows Ready Print | Если не останется — сначала готовят другой путь вывода или решают WPP не использовать |
| 2. Зависимости приложения | Нет ли зависимости от настроек драйвера, имени очереди, виртуального принтера, отправки RAW | Правят соответствующие места. Включая зависимости внутри SDK и библиотеки форм |
| 3. Проверить фактическим выводом | Меняются ли драйвер и очередь — формы, PDF, этикетки всё равно выходят верно | Среду, где WPP используют, проверяют включив; где не используют — другим порядком |
Если только рисуют через PrintDocument или FixedDocument, в основе это объект проверки, не переписывания. Но если сама очередь назначения при WPP исчезает и зарегистрировать заново нельзя, даже без проблем в коде рисования печатать нельзя. Сначала нужен другой путь.
Если начинать с работы: перечень 5.1 → назначение по таблицам главы 4 и 5.1 → зависимости 5.2–5.5 → выбор пути главы 6 → проверка главы 7. Фон мест, где решение неясно, — главы 2–4.
Дальше Windows protected print mode сокращаем до WPP. «Очередь» — назначение печати, зарегистрированное в Windows; «спулер» — механизм, который принимает задание печати и передаёт его в назначение.
На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 39, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle
2. Что решено ── трёхступенчатая временная линия
2.1 Кончается поставка и обновление, не массовая остановка существующих драйверов
Первичный источник — Microsoft Learn, «End of servicing plan for third-party printer drivers on Windows». План объявили в сентябре 2023, даты пересмотрели в мае 2025. На момент написания план такой.1
| Срок | Что меняется | На что смотреть стороне бизнес-приложения |
|---|---|---|
| 15 января 2026 | На Windows 11 и новее и Windows Server 2025 и новее новые драйверы принтера в Windows Update не кладут. Обновление существующих — по отдельному разбору | При развёртывании нового ПК или принтера драйвер производителя прежним способом получить уже не обязательно получится |
| 1 июля 2026 | Ранжирование драйверов принтера меняют так, чтобы всегда предпочитать IPP class driver, поставляемый с Windows | На устройствах, к которым IPP class driver тоже подходит, при замене ПК или повторном обнаружении принтера могут выбрать другой драйвер |
| 1 июля 2027 | Кроме исправлений безопасности обновления сторонних драйверов принтера не принимают | Дату остановки обновлений не путать со сроком готовности на стороне приложения |
Существующие драйверы по-прежнему ставят из Windows Update и установщика производителя; Microsoft говорит, что отключать функции драйверов v3/v4 не планирует. То есть это план поэтапно закончить поставку и обновление драйверов, а не план в тот день отключить драйверы, уже стоящие на ПК на месте.1
flowchart TB
accTitle: Что меняется и что нет при окончании драйверов
accDescr: Само окончание сопровождения драйверов принтера вход API рисования приложения и существующие драйверы не меняет; бумага, собственные функции и имя очереди, которые возвращает драйвер, сменяются, только когда при новой установке или повторном обнаружении выбирают другой драйвер; изменения от включения Windows protected print mode, включая удаление виртуальных принтеров, — другой механизм, глава 4
eos["Окончание сопровождения драйверов принтера"]
eos --> keep["Что не меняется"]
eos --> cond["Когда при новой установке или повторном обнаружении выбирают другой драйвер"]
cond --> change["Что сменяется"]
keep --> api["Вход API рисования"]
keep --> drv["Существующие драйверы"]
change --> caps["Бумага, лоток, собственные функции"]
change --> qname["Имя очереди"]
Рис. 1: Одного окончания сопровождения мало, чтобы что-то сменилось; сведения и имена, которые давал драйвер, сменяются, когда выбирают другой драйвер. Изменения от включения WPP, включая удаление виртуальных принтеров, — другой механизм (глава 4).
2.2 На месте драйвер меняется в основном в двух сценах
Даже если план существующие драйверы не останавливает, в следующих сценах среда, которую видит приложение, меняется.
| Сцена | Что происходит |
|---|---|
| Замена ПК, переустановка ОС, повторное обнаружение принтера | Если к устройству подходит и IPP class driver, ранжирование может выбрать другой драйвер, чем раньше |
| Включение WPP | Принтеры на сторонних драйверах удаляют. Совместимые регистрируют заново через Windows Ready Print; несовместимые как есть не работают |
Когда к одному устройству подходят несколько пакетов драйверов, Windows ставит каждому ранг и выбирает лучший. Изменение 1 июля 2026 предпочитает IPP class driver в этом выборе. На устройствах, где IPP class driver кандидатом не становится, пакет производителя по-прежнему могут выбрать.31
flowchart TB
accTitle: Два пути, которыми на месте сменяется драйвер
accDescr: На устройствах, к которым подходит IPP class driver, при замене ПК, переустановке ОС или повторном обнаружении принтера ранжирование выбирает IPP class driver и драйвер сменяется; при включении Windows protected print mode принтеры на сторонних драйверах удаляют; модели, которые можно зарегистрировать заново через Windows Ready Print, меняют драйвер, модели, которые нельзя, теряют назначение печати
site["ПК на месте"]
site --> r1["Замена ПК, переустановка ОС, повторное обнаружение"]
site --> r2["Включение Windows protected print mode"]
r1 --> rank["Предпочтение на устройствах, к которым подходит IPP class driver"]
r2 --> del["Удалить принтеры на сторонних драйверах"]
rank --> swap["Драйвер сменяется"]
del --> re{"Можно зарегистрировать заново через Ready Print?"}
re -->|"Да"| swap
re -->|"Нет"| lost["Назначение печати исчезает"]
Рис. 2: Разделив план окончания сопровождения и WPP, отделяют сцену смены драйвера от сцены, где пропадает само назначение печати.
Здесь важно не считать IPP-совместимость и сертификацию Mopria одним условием.
| Условие | Для какого решения в основном |
|---|---|
| IPP class driver подходит к устройству | Может ли смена ранжирования сменить драйвер |
| Есть сертификация Mopria; при сетевом подключении IPP включён и достижим; при USB — режим IPP over USB | Можно ли физический принтер под WPP зарегистрировать заново как Windows Ready Print |
На устройствах без сертификации Mopria, но с IPP, драйвер может смениться и без WPP из-за смены ранжирования. Наоборот, одно имя драйвера «Microsoft IPP Class Driver» ещё не подтверждает, что под WPP пользоваться можно.14
flowchart TB
accTitle: Подход IPP class driver и сертификация Mopria — разные условия
accDescr: Если принтер умеет IPP, смена ранжирования может выбрать IPP class driver и сменить драйвер; сертификация Mopria — отдельное условие, решает, можно ли зарегистрировать заново под Windows protected print mode; у сетевых нужна достижимость включённого IPP, у USB — режим IPP over USB
printer["Принтер"]
printer --> q1{"Умеет IPP?"}
q1 -->|"Да"| rank["Может смениться"]
q1 -->|"Нет"| keep["Остаётся производителя"]
printer --> q2{"Есть сертификация Mopria?"}
q2 -->|"Нет"| ng["Под WPP зарегистрировать заново нельзя"]
q2 -->|"Да"| q3{"USB?"}
q3 -->|"Нет"| q5{"IPP включён и достижим?"}
q5 -->|"Да"| ok["Под WPP можно зарегистрировать заново"]
q5 -->|"Нет"| ng
q3 -->|"Да"| q4{"Режим IPP over USB?"}
q4 -->|"Да"| ok
q4 -->|"Нет"| ng
Рис. 3: Влияние ранжирования — по IPP; останется ли под WPP — по сертификации Mopria плюс достижимость включённого IPP (при USB — режим IPP over USB).
2.3 У подписи драйвера есть исключения, но продолжение не гарантируют
После 15 января 2026 драйверы, попадающие в одно из следующего, могут подать заявку на исключение подписи на отдельный разбор.1
- Для принтеров, которые не могут получить сертификацию Mopria.
- Пакет, у которого верхняя граница целевой ОС — Windows 10 и ниже.
- Машинный драйвер ARM64.
И WHQL, и Attestation по умолчанию блокируют; ручной разбор — с документом обоснования. Даже при выполнении условий не гарантируют, что производитель подаст и Microsoft одобрит.5 И получить подписанный драйвер и пользоваться им в среде с включённым WPP — разное. Готовность принтеров этикеток и чеков — глава 6.
flowchart TB
accTitle: Условия, при которых после 15 января 2026 подпись драйвера ещё могут признать
accDescr: Подача драйвера производителем по умолчанию блокируется; на отдельный разбор заявки на исключение кладут только то, что попадает в одно из трёх: принтер без сертификации Mopria, пакет с верхней границей Windows 10 и ниже, машинный ARM64; разбор может одобрить, подпись не гарантируют
submit["Подача драйвера производителем"]
submit --> block["По умолчанию блокируют"]
block --> c1["Модели без сертификации Mopria"]
block --> c2["Верхняя граница Windows 10 и ниже"]
block --> c3["Машинный ARM64"]
c1 --> apply["Заявка на исключение возможна"]
c2 --> apply
c3 --> apply
apply --> review["Отдельный разбор"]
review --> maybe["Иногда одобряют (гарантии нет)"]
Рис. 4: Условие даёт только попасть на разбор; подпишут ли — не гарантируют.
3. Устройство ── прежний путь драйвера и Windows Ready Print
3.1 Меняется путь печати за API рисования
В прежней печати Windows приложение отдаёт команды рисования GDI или XPS, спулер принимает задание, драйвер принтера переводит в язык принтера (PDL) и отправляет. И путь печати GDI, и путь XPS стоят на этой структуре.6
flowchart TB
accTitle: Прежний путь драйвера
accDescr: Команды рисования GDI или XPS бизнес-приложения спулер с правами SYSTEM ставит в очередь; сторонний драйвер v3 или v4 переводит в собственный PDL — без изоляции драйвера внутри самого спулера, при общей или отдельной изоляции в другом процессе — и отправляет на принтер
app["Бизнес-приложение (GDI / XPS)"] --> spooler["Спулер (права SYSTEM)"]
spooler --> iso{"Изоляция драйвера"}
iso -->|"Нет"| inproc["Сторонний драйвер внутри самого спулера"]
iso -->|"Общая / отдельная"| host["Сторонний драйвер в другом процессе"]
inproc --> pdl["Перевод в собственный PDL"]
host --> pdl
pdl --> printer["Принтер"]
Рис. 5: На прежнем пути процесс меняется от изоляции, но структура одна: внутри стека печати сторонний код переводит в PDL.
Преемник — Windows Ready Print. Имя, которое связывает печать по IPP (Internet Printing Protocol), сканирование по eSCL и Universal Print; сторонний драйвер не нужен. Спроектирован для принтеров с сертификацией Mopria; плюс — независимость от архитектуры ЦП.7
С Windows 10 21H2 поставляется Microsoft IPP Class Driver, который ведёт принтеры, соответствующие Mopria, по сети и USB.1 Облачная очередь Universal Print пользуется поставляемым Universal Print Class Driver.8
flowchart TB
accTitle: Путь Windows Ready Print
accDescr: Команды рисования бизнес-приложения принимает спулер; поставляемый Microsoft IPP Class Driver на клиенте рендерит в PWG Raster или PDF и шлёт по IPP на принтер с сертификацией Mopria, либо поставляемый Universal Print Class Driver шлёт IPP over HTTPS в службу Universal Print; Windows protected print mode разрешает только этот путь Windows Ready Print
app["Бизнес-приложение (GDI / XPS)"] --> spooler["Спулер"]
spooler --> ipp["Microsoft IPP Class Driver"]
ipp --> render["Рендер в PWG Raster / PDF"]
render --> printer["Принтер с сертификацией Mopria (IPP)"]
spooler --> up["Universal Print Class Driver"]
up --> cloud["Служба Universal Print (IPP over HTTPS)"]
wpp["Windows protected print mode"] -.->|"Разрешает только путь Ready Print"| ipp
wpp -.-> up
Рис. 6: Windows Ready Print тоже идёт через спулер. Меняется то, кто переводит и отправляет: со стороннего драйвера на поставляемый class driver.
IPP — протокол на HTTP; принтер опознают URI вроде ipps://printer.example.com/ipp/print. PDL бездрайверной печати — немногие форматы на открытых стандартах вроде PWG Raster и PDF; итоговый документ рендерят на клиенте.9 В Universal Print спулер шлёт задание в службу IPP over HTTPS.8
Вход со стороны приложения не меняется. Приложение, которое рисует GDI или XPS, вызывает те же API. Меняется механизм дальше, который возвращает перечень бумаги и лотков, даёт собственные функции и переводит в PDL. Поэтому сильнее задевает не приложение, которое только рисует, а то, которое зависит от сведений драйвера и собственных настроек. Собственные функции производителя проверяют и как предоставление через Print Support App (PSA).10
3.2 У МФУ печать, факс и сканирование подтверждают раздельно
Перенести на Windows Ready Print можно, если устройство несёт эту функцию и реализует соответствующий протокол.1
| Функция | Что нужно при сетевом подключении | Дополнительное условие при USB |
|---|---|---|
| Печать | IPP | Режим IPP over USB |
| Отправка факса | IPP Fax Out | Режим IPP over USB |
| Сканирование | eSCL или WS-Scan | Режим IPP over USB |
Не решайте, что факс и сканирование тоже переедут, по одной печати Mopria.
flowchart TB
accTitle: Порядок раздельной проверки функций МФУ
accDescr: Берут по одной используемой функции и по порядку подтверждают наличие на устройстве, протокол из таблицы, при USB — режим IPP over USB; результат печати на факс и сканирование не переносят, остальные функции проверяют отдельно
start["Взять одну используемую функцию"]
start --> feature{"Устройство несёт эту функцию?"}
feature -->|"Да"| protocol{"Протокол из таблицы есть?"}
feature -->|"Нет"| unmet["Условие этой функции не выполнено"]
protocol -->|"Да"| usb{"USB?"}
protocol -->|"Нет"| unmet
usb -->|"Да"| mode{"Режим IPP over USB?"}
usb -->|"Нет"| checked["Условие этой функции подтверждено"]
mode -->|"Да"| checked
mode -->|"Нет"| unmet
checked --> next["Остальные функции — отдельно"]
unmet --> next
Рис. 7: По порядку: наличие функции, протокол, дополнительное условие подключения. Результат печати на факс и сканирование не переносят.
3.3 Фон — безопасность стека печати
В разборе Microsoft Learn сбои печати составляют 9% случаев MSRC (Microsoft Security Response Center) за три года, которые там свели. Спулер работает с правами SYSTEM, до него широко доходят и стандартные пользователи, сторонний код загружает по требованию. У старых драйверов нет совместимости с современными смягчениями вроде CFG и CET; структуру, где нужно участие всего кода, трудно закрыть смягчением.9
flowchart TB
accTitle: Почему смягчение не работает, пока загружают сторонний драйвер
accDescr: Спулер с правами SYSTEM загружает сторонний код; старые драйверы несовместимы со смягчениями вроде CFG и CET, поэтому смягчение, которому нужно участие всех, на спулер не наложить, уязвимости легче эксплуатировать
sys["Спулер — права SYSTEM"]
load["Сторонний код загружают по требованию"]
old["Старые драйверы несовместимы со смягчением"]
sys --> risk["Уязвимости легче эксплуатировать"]
load --> nomit["Смягчение (CFG / CET / ACG) не наложить"]
old --> nomit
nomit --> risk
Рис. 8: Смягчение работает, только когда участвуют все; пока драйвер не убрать, спулер не закрыть.
Где работает сторонний драйвер, меняет настройка изоляции драйвера принтера.11
| Режим изоляции | Где работает драйвер |
|---|---|
| Нет (None) | В процессе самого спулера |
| Общая (Shared) | Другой процесс, общий с другими драйверами |
| Отдельная (Isolated) | Отдельный процесс только этого драйвера |
Драйвер с DriverIsolation=2 в INF по умолчанию берёт общий процесс; без объявления — по умолчанию внутри самого спулера. Администратор может переопределить консолью управления печатью или групповой политикой. Но в любом режиме сторонний код внутри стека печати работает.11 WPP — режим работы, который эту зависимость от стороннего кода снимает.
flowchart TB
accTitle: Как решается процесс, в котором работает сторонний драйвер
accDescr: Драйвер с DriverIsolation=2 в INF по умолчанию работает в другом общем процессе, не спулере; без объявления — по умолчанию внутри самого спулера; администратор настройкой или политикой может переопределить на общий, внутрь спулера или отдельный процесс только драйвера
inf{"INF объявляет DriverIsolation=2"}
inf -->|"Да"| shared["Работает в другом общем процессе (по умолчанию)"]
inf -->|"Нет"| inproc["Работает внутри самого спулера (по умолчанию)"]
admin["Переопределение настройкой или политикой администратора"] -.-> shared
admin -.-> inproc
admin -.-> isolated["Работает в отдельном процессе (изоляция)"]
Рис. 9: Режим изоляции задают объявлением INF и настройкой администратора; старый драйвер без объявления по умолчанию внутри самого спулера.
4. Что исчезает в Windows protected print mode
4.1 WPP — режим работы «только Windows Ready Print»
WPP ввели в Windows 11 24H2. На момент написания статьи по умолчанию выключен; пока выключен, установки драйверов и функций печати не ограничивают.1213 Разделяют способ включения и того, кто может вернуть.
| Путь включения | Где задают | Как вернуть выключенным |
|---|---|---|
| Приложение «Параметры» | Windows protected print mode в «Принтеры и сканеры» | Если включал сам в «Параметрах», сам же там и возвращает |
| Групповая политика | «Конфигурация компьютера > Административные шаблоны > Принтеры > Configure Windows protected print» | Политику меняет администратор |
| Intune | OMA-URI ./Device/Vendor/MSFT/Policy/Config/Printers/ConfigureWindowsProtectedPrint |
Политику меняет администратор |
Если включили групповой политикой, пользователь без обращения к администратору не снимет. OMA-URI Intune — тот же путь политики устройства на ADMX. Вернуть с экрана параметров может сам, только если сам там и включил.14213
flowchart TB
accTitle: Три пути включения Windows protected print mode
accDescr: Windows protected print mode включают приложением Параметры, групповой политикой или OMA-URI Intune; сам пользователь возвращает из Параметров, только если сам там включал; политику групповой политики или Intune без смены на стороне администратора не снять
s["Приложение Параметры (включает сам)"] --> wpp["Windows protected print mode включён"]
g["Групповая политика"] --> wpp
i["Intune (OMA-URI)"] --> wpp
s -.->|"Сам возвращает из Параметров"| off["Снять"]
g -.->|"Сам не вернёт"| adm["Снятие — смена политики на стороне администратора"]
i -.->|"Сам не вернёт"| adm
Рис. 10: Путей включения три; сам возвращает, только если включал в «Параметрах».
4.2 Очереди, которые остаются, исчезают и требуют повторной регистрации
Влияние при включении зависит не только от самого принтера, но и от каким драйвером сейчас зарегистрирован.2
| Текущее назначение | При включении WPP | Как готовиться |
|---|---|---|
| Физический принтер, зарегистрированный сторонним драйвером (v3/v4) | Очередь удаляют, драйвер убирают из хранилища драйверов | Совместимый — зарегистрировать заново через Windows Ready Print. Несовместимый — другой путь или не использовать WPP |
| Принтер с сертификацией Mopria, но зарегистрированный драйвером производителя | Один раз удаляют. Сертификация не значит, что существующая очередь останется | Сеть — включение и достижимость IPP; USB — режим IPP over USB; затем зарегистрировать заново |
| Совместимый принтер, уже зарегистрированный Windows Ready Print | Продолжает работать | Проверить возможности, настройки, фактический вывод |
| Облачная очередь Universal Print | На стороне, совместимой с WPP, как часть Windows Ready Print | Проверить зависимость от имени очереди и фактический вывод |
| Неподдерживаемый программный принтер | Удаляют | У сторонних PDF-принтеров смотреть поддержку WPP продукта. Сохранение форм — к прямой генерации библиотекой PDF |
| Виртуальный принтер, уже обновлённый под WPP | Не смешивать с несовместимыми продуктами. У OneNote есть Protected virtual printer | Проверить, какой именно продукт и очередь используют |
| Microsoft XPS Document Writer, виртуальный принтер факса | Удаляют | После возврата WPP выключенным XPS ставят вручную из «Компоненты Windows», факс — из необязательного компонента «Факс и сканирование Windows» |
flowchart TB
accTitle: Что происходит с принтером при включении Windows protected print mode
accDescr: При включении удаляют принтеры, введённые сторонним драйвером, и неподдерживаемые виртуальные принтеры, XPS Document Writer, виртуальный принтер факса; модели с сертификацией Mopria, у которых при сети IPP включён и достижим, при USB — режим IPP over USB, регистрируют заново через Windows Ready Print; несовместимые, пока режим включён, не работают
on["Включить WPP"]
on --> third["Удалить принтеры на сторонних драйверах"]
on --> soft["Удалить несовместимые виртуальные принтеры"]
soft --> xps["Удалить и XPS Document Writer, и факс"]
third --> mopria{"Есть сертификация Mopria?"}
mopria -->|"Да"| conn{"Подключение"}
conn -->|"Сеть"| ipp{"IPP включён и достижим?"}
conn -->|"USB"| usb{"Режим IPP over USB?"}
ipp -->|"Да"| re["Зарегистрировать заново через Windows Ready Print"]
usb -->|"Да"| re
ipp -->|"Нет"| no["Пока включён — не работать"]
usb -->|"Нет"| no
mopria -->|"Нет"| no
Рис. 11: Очередь драйвера производителя исчезает один раз даже при сертификации Mopria. Условия повторной регистрации подтверждают отдельно.
Пока WPP включён, удалённые сторонние драйверы не работают. И выключение WPP само не возвращает принтер, заново поставленный Windows Ready Print, на исходный драйвер.210
На стороне приложения объект проверки — обработка, исходящая из бумаги, лотков и собственных функций драйвера производителя, виртуального принтера типа DLL монитора порта, XPS Document Writer. Обработка, которая напрямую порождает файл XPS через XpsDocument и подобное, — не печать в виртуальную очередь XPS Document Writer и не объект этого удаления.
4.3 Меняются и управление, и внутренности спулера
При WPP сторонние двоичные файлы вроде DLL монитора порта не загружают. API загрузки модулей вроде AddPrintProvidorW новые модули не загружают; грузят только двоичные файлы с подписью Microsoft, нужные IPP. AddPrintProvidorW — историческое написание в winspool.h; в разборе Microsoft Learn пишут AddPrintProviderW.9
Из-за этого ограничения рендер XPS идёт не от SYSTEM, а с правами пользователя; у нового рабочего процесса спулера — ограниченный маркер без SeTcbPrivilege и подобного. Порождение дочерних процессов запрещено, CFG, CET, ACG включены.9
flowchart TB
accTitle: Изменения спулера в Windows protected print mode
accDescr: Отказ загружать сторонние двоичные файлы даёт ограничение загрузки модулей, рендер XPS с правами пользователя, рабочий процесс с ограниченным маркером, запрет порождения дочерних, включение CFG, CET, ACG
nodrv["Сторонние двоичные файлы не загружают"]
nodrv --> r["Ограничение загрузки"]
nodrv --> l["Сжатие прав"]
nodrv --> m["Включение смягчений"]
r --> r2["Только двоичные файлы с подписью Microsoft"]
l --> l2["XPS с правами пользователя, ограниченный маркер"]
m --> m2["Запрет дочерних процессов, CFG / CET / ACG"]
Рис. 12: Смягчения, которые на рис. 8 не работали, впервые можно включить, убрав сторонние двоичные файлы.
Point and Print: конфигурация IPP остаётся, установку сторонних драйверов больше не делают. Порядок киттинга, исходящий из «подключился к серверу печати — драйвер раздадут», тоже пересматривают.9
Включён ли WPP сейчас, на Windows 11 24H2 и новее смотрят WinRT API Windows.Graphics.Printing.ProtectedPrint.WindowsProtectedPrintInfo.IsProtectedPrintEnabled.15 Значение групповой политики — WindowsProtectedPrintGroupPolicyState под HKLM\Software\Policies\Microsoft\Windows NT\Printers\WPP.13
С клиента с включённым WPP сервер печати с выключенным WPP консолью управления печатью не ведут. Администратору готовят отдельный управляющий клиент с выключенным WPP.14
5. Инвентаризация существующего приложения ── четыре места
flowchart TB
accTitle: Четыре места инвентаризации в бизнес-приложении
accDescr: В коде печати бизнес-приложения четыре зависимости — сохранение настроек драйвера, зависимость от имени очереди (включая внутри SDK и библиотек), зависимость от виртуального принтера, который WPP не поддерживает, отправка RAW в очередь, которая при WPP не останется — объект переписывания; код, который только рисует, — объект проверки
app["Код печати бизнес-приложения"]
app --> deps["Инвентаризация четырёх зависимостей"]
app --> d0["Только рисование"]
deps --> d1["Сохранение собственных настроек"]
deps --> d2["Зависимость от имени очереди"]
deps --> d3["Зависимость от виртуального принтера"]
deps --> d4["Отправка RAW"]
d2 -.-> d2n["Включая внутри SDK"]
d3 -.-> d3n["То, что WPP не поддерживает"]
d4 -.-> d4n["В очередь, которая не останется"]
d1 --> fix["Переписывать"]
d2 --> fix
d3 --> fix
d4 --> fix
d0 --> verify["Проверять"]
Рис. 13: Переписывают только четыре зависимости; код, который только рисует, отдают проверке.
5.1 Сначала берут перечень драйверов на месте и решают о назначении
Нужно ли переписывать, решают, посмотрев, что стоит на месте. Перечень очередей и драйверов берут модулем PrintManagement PowerShell. Перечень Get-Printer и Get-PrinterDriver прав администратора не требует; pnputil дальше — требует.1617
# По очередям: имя драйвера, основная версия (3 = v3, 4 = v4), поставщик, имя INF
Get-Printer |
Select-Object Name, DriverName, PortName,
@{ Name = "DriverMajorVersion"; Expression = { (Get-PrinterDriver -Name $_.DriverName).MajorVersion } },
@{ Name = "Manufacturer"; Expression = { (Get-PrinterDriver -Name $_.DriverName).Manufacturer } },
@{ Name = "InfName"; Expression = { Split-Path -Leaf (Get-PrinterDriver -Name $_.DriverName).InfPath } } |
Sort-Object DriverName |
Format-Table -AutoSize
# Только сторонние пакеты драйверов: опубликованное имя (oemN.inf), исходное имя INF, поставщик (нужны права администратора)
pnputil /enum-drivers /class Printer
По MajorVersion отличают v3 и v4.18 Но различие v3/v4 и различие поставляемый/сторонний — разное. Классифицируют так.
| Класс | Как отличить | Что подтвердить дальше |
|---|---|---|
| Очередь IPP class driver | DriverName — Microsoft IPP Class Driver |
Сертификация Mopria, включение и достижимость IPP в сети, режим IPP over USB на USB. По одному имени WPP-совместимость не решать |
| Очередь Universal Print | Пользуется поставляемым Universal Print Class Driver8 | Как сторона, совместимая с WPP; проверить зависимость приложения от имени очереди и вывод |
| Очередь другого поставляемого драйвера | Не известное имя class driver и не в перечне сторонних пакетов | XPS и факс — объект удаления. Generic / Text Only и подобные не считать «останутся». Microsoft Print to PDF в перечне удаления не назван — решать по очереди |
| Очередь драйвера производителя | Имя INF и поставщика сверить с перечнем сторонних пакетов pnputil |
Кандидат смены драйвера. При WPP существующая очередь исчезает — подтвердить, можно ли физическое устройство зарегистрировать заново |
InfPath у Get-PrinterDriver — путь к INF в хранилище драйверов; опубликованное oemN.inf не гарантируют. Сверяют опубликованное имя, исходное имя INF и поставщика pnputil /enum-drivers с именем файла InfPath и Manufacturer. pnputil /enum-drivers перечисляет только сторонние пакеты; поставляемые в перечень не попадают.1917
flowchart TB
accTitle: Порядок инвентаризации перечня принтеров на месте
accDescr: PowerShell берёт перечень очередей и драйверов; по DriverName и сверке Manufacturer с перечнем сторонних пакетов pnputil делят на очередь IPP class driver, очередь Universal Print (совместима с WPP), очередь другого поставляемого драйвера (XPS и факс удаляют, Generic / Text Only нельзя считать что останется, Microsoft Print to PDF в перечне удаления не назван — решать отдельно), очередь драйвера производителя (кандидат смены); у IPP class driver отдельно подтверждают Mopria, при сети — достижимость IPP, при USB — режим IPP over USB, затем обе очереди сверяют с очередями, на которые смотрят настройки и код печати приложения, и раскладывают по таблице решений
list["Взять перечень Get-Printer / Get-PrinterDriver"]
list --> cls{"DriverName и поставщик"}
cls -->|"IPP Class"| ipp["Очередь IPP class driver"]
cls -->|"Universal Print Class"| up["Очередь Universal Print"]
cls -->|"Другой поставляемый"| inbox["Останется ли — по таблице главы 4 отдельно"]
cls -->|"Производителя"| vendor["Кандидат смены"]
ipp --> mop["Подтвердить Mopria, IPP, USB"]
mop --> match["Сверить с настройками и кодом приложения"]
up --> match
inbox --> match
vendor --> match
match --> judge["Разложить по таблице решений"]
Рис. 14: До разделения по имени прав администратора не нужно; сверка поставщика — права администратора у pnputil.
Этот перечень сверяют с очередями, на которые смотрят настройки приложения, код печати и используемый SDK. По каждой поставке записывают драйвер, сертификацию Mopria, способ подключения, достижимость IPP, режим USB — тогда решают по таблице главы 4.
Если при WPP назначение не остаётся и зарегистрировать заново нельзя, раньше инвентаризации кода готовят другой путь главы 6 или решают WPP не использовать. Если WPP не используют, но устройство может попасть под смену ранга IPP, дальше подтверждают с 5.2. Если WPP не используют и смены драйвера тоже нет — решение оставить нынешний путь.
Имя драйвера из приложения читают в WPF через PrintQueue.QueueDriver.Name пространства System.Printing.20
using System.Printing;
// Из средства управления или настольного приложения перечислить имя драйвера каждой очереди
using var server = new LocalPrintServer();
foreach (PrintQueue queue in server.GetPrintQueues(
new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }))
{
Console.WriteLine($"{queue.Name}\t{queue.QueueDriver?.Name}\t{queue.QueuePort?.Name}");
}
Но пространство имён System.Printing внутри службы Windows не поддерживается. Если печатает резидентная служба, эту диагностику кладут на сторону средства управления.21 Ограничения печати из службы — в Как создать и эксплуатировать службу Windows — от выбора между Планировщиком заданий и службой до превращения BackgroundService в службу и главе 7 предыдущей статьи.
5.2 Проверка 1: не сохраняют и не восстанавливают ли настройки драйвера
Труднее всего найти сохранение настроек печати. От способа сохранения ломается по-разному.
| Что сохраняют | Типичная реализация | Почему ломается при смене драйвера |
|---|---|---|
Закрытая часть DEVMODE |
Целиком сохраняют результат DocumentProperties или буфер GetHdevmode и возвращают SetHdevmode |
Закрытые данные толкует только этот драйвер |
Весь PrinterSettings .NET Framework |
После диалога печати объект сериализуют двоично | Внутри может сохраниться и закрытая область скопированного драйвера |
| Значения открытых свойств | PaperSize, PaperSource, PrinterResolution, Duplex сохраняют своим форматом |
Не закрытый буфер, а смысл номера своей бумаги и лотка меняется |
PrintTicket с частным расширением |
Сохраняют XML с собственным пространством имён производителя | Собственное расширение зависит от исходного драйвера и модели |
У DEVMODE за открытыми членами могут лежать закрытые данные, размер которых показывает dmDriverExtra. Windows проверяет только открытую часть; испорченные закрытые данные могут уронить драйвер в процессе приложения или спулера.22
flowchart TB
accTitle: Открытая и закрытая части DEVMODE
accDescr: Структура DEVMODE за открытыми членами держит закрытые данные драйвера, которые показывает dmDriverExtra; открытую часть проверяет Windows, закрытую толкует только этот драйвер, поэтому сохранение целиком при смене драйвера теряет смысл
dm["Структура DEVMODE"]
dm --> pub["Открытая часть (dmSize)"]
dm --> priv["Закрытая часть (dmDriverExtra)"]
pub --> chk["Проверяет Windows"]
priv --> only["Толкует только этот драйвер"]
only --> lost["При смене драйвера смысл пропадает"]
Рис. 15: Из сохранённых целиком настроек ломается закрытая часть.
PrinterSettings, принявший настройки через SetHdevmode, копирует эту закрытую область внутрь.23 У PrinterSettings версии .NET Framework есть атрибут Serializable; двоичная сериализация по умолчанию включает и закрытые поля, поэтому в сохранении объекта целиком та же зависимость может прятаться.2425
У PrinterSettings версии .NET атрибута Serializable нет; реализация, которая открытые свойства сохраняет по одному своим форматом, нативный буфер DEVMODE и область dmDriverExtra не сохраняет.24 Здесь смотрят значения, зависящие от драйвера.
flowchart TB
accTitle: Сохранение DEVMODE и сохранение управляемых значений ломаются по-разному
accDescr: Реализация, которая сохраняет буфер DEVMODE целиком, и реализация, которая сериализует целиком PrinterSettings после SetHdevmode с закрытой областью, носят закрытую часть и при смене драйвера теряют смысл; реализация, которая сохраняет значения открытых свойств, носит номера Custom и бумаги и лотков производителя относительно перечня драйвера производителя, и IPP class driver не обязан толковать их так же; обе заменяют дизайном «сохранять только намерение»
a["Сохранить DEVMODE целиком"]
a --> a1["Носят вместе с закрытой частью"]
s["Сохранить целиком после SetHdevmode"] --> a1
a1 --> a2["При смене драйвера смысл пропадает"]
b["Сохранить значения открытых свойств"]
b --> b1["Носят номера своей бумаги и лотка"]
b1 --> b2["Нет гарантии того же смысла у нового драйвера"]
a2 --> c["Обе — к сохранению только намерения"]
b2 --> c
Рис. 16: Сохранение объекта целиком после SetHdevmode входит в сторону закрытой части; ломается иначе, но обе носят состояние драйвера.
Если RawKind означает стандартные PaperKind или PaperSourceKind, смысл при смене драйвера сохраняется. Нет гарантии, что Custom и номер производителя у другого драйвера указывают на ту же бумагу и лоток. Стандартные значения оптом «сломаются» не считают.2627
flowchart TB
accTitle: Что из сохранённых значений бумаги и лотка ломается
accDescr: Среди RawKind значения, соответствующие стандартной бумаге вроде A4 (PaperKind) и стандартным источникам вроде Upper и Lower (PaperSourceKind), смысл при смене драйвера сохраняют; Custom и значения производителя — номера относительно перечня драйвера производителя, IPP class driver не обязан толковать их как ту же бумагу и лоток
raw["Сохранённый RawKind"]
raw --> std["Стандартные значения (PaperKind и т. п.)"]
raw --> cus["Custom и значения производителя"]
std --> keep["Смысл при смене драйвера сохраняется"]
cus --> lost["Нет гарантии толкования как той же бумаги и лотка"]
Рис. 17: Ломается не стандартное значение, а свой номер относительно перечня драйвера производителя.
У PrintTicket открытые ключевые слова определены в пространстве имён psk, но можно включить частные расширения устройства. Элементы третьей стороны по правилу кладут в пространство имён, явно связанное с этой третьей стороной. Если в сохранённом XML смешано пространство имён производителя — подтверждают как настройку драйвера.2829
Мера: сохраняют только «намерение»
Намерение — размер бумаги, ориентация, двусторонняя печать, число копий, выбор лотка — держат в своём файле настроек открытыми ключевыми словами. Состояние внутри драйвера не переносят: сразу перед печатью сверяют с текущими возможностями.
В WPF возможности берут PrintQueue.GetPrintCapabilities, требование делают PrintTicket и передают в MergeAndValidatePrintTicket.30 Важно: неподдерживаемое требование не обязательно даёт ошибку. Драйвер может разрешить конфликт и обычно вернуть действительный билет, подставив значение по умолчанию.
Если ValidationResult.ConflictStatus — ConflictResolved, двустороннюю печать и лоток ValidatedPrintTicket сравнивают с требованием, разницу пишут в журнал и сообщают пользователю.31
flowchart TB
accTitle: Дизайн «сохранять только намерение и сразу перед печатью сверить с возможностями»
accDescr: В файле настроек только намерение бумаги, ориентации, двусторонней печати, числа копий, лотка открытыми ключевыми словами; сразу перед печатью GetPrintCapabilities берёт возможности текущего принтера, пропускают через MergeAndValidatePrintTicket; при ConflictStatus NoConflict печатают как есть, при ConflictResolved подменённые пункты сверяют с требованием и отдают в журнал и уведомление
cfg["Файл настроек: только намерение (бумага, ориентация, двусторонняя, копии)"]
cfg --> caps["Сразу перед печатью GetPrintCapabilities"]
caps --> merge["MergeAndValidatePrintTicket"]
merge --> st{"ConflictStatus"}
st -->|"NoConflict"| print["Печать"]
st -->|"ConflictResolved"| tell["Разницу с требованием — в журнал и уведомление"]
Рис. 18: Намерение настроек сохраняют и при печати проверяют текущими возможностями. Подменённые настройки молча не используют — смотрят разницу.
В WinForms бумагу из PrinterSettings.PaperSizes выбирают заново не по имени, а по Kind и размерам. Источник PaperSources при однозначном стандартном значении вроде Upper и Lower можно использовать снова, но несколько своих лотков часто возвращают одним PaperSourceKind.Custom. К тому же у PaperSource нет размера бумаги. Свой лоток одним Kind не опознают: явно переназначают на текущие возможности или дают пользователю выбрать заново.27
5.3 Проверка 2: нет ли зависимости от имени принтера и очереди
В предыдущей статье советовали держать имя принтера в файле настроек. Здесь добавляют предпосылку: после смены драйвера или повторного обнаружения очередь с тем же именем не обязаны создать. Настройка, указывающая на старое имя очереди, назначение теряет.
Смотрят три места: файл настроек, имя, вписанное в код, внутри SDK и библиотеки форм. Даже без фиксированного имени в своём коде SDK производителя внутри может вызывать конкретную очередь или драйвер. Сверяют документацию SDK с перечнем 5.1.
flowchart TB
accTitle: Три места, где прячется зависимость от имени очереди
accDescr: Зависимость от имени очереди прячется в фиксированном имени файла настроек, фиксированном имени в коде и очереди или драйвере, которые внутри вызывает SDK производителя или библиотека форм; первые два находят поиском по коду и настройкам, последнее — документацией SDK и перечнем 5.1
dep["Зависимость от имени очереди"]
dep --> cfg["Фиксированное имя в файле настроек"]
dep --> code["Фиксированное имя, вписанное в код"]
dep --> sdk["Фиксация внутри SDK и библиотеки"]
cfg --> grep["Найти поиском по коду и настройкам"]
code --> grep
sdk --> doc["Подтвердить документацией SDK и перечнем 5.1"]
Рис. 19: Даже без имени очереди в своём коде зависимость может остаться внутри SDK и библиотеки.
Мера: при запуске проверяют, есть ли заданное имя в PrinterSettings.InstalledPrinters; если нет — пишут журнал и сообщают пользователю. С экрана настроек назначение печати тоже дают выбрать заново.
На принтер по умолчанию молча не переходят. Иначе аварию «накладная вышла из принтера другого отдела» прячут как нормальную печать.
flowchart TB
accTitle: Проверка имени принтера при запуске
accDescr: При запуске проверяют, есть ли имя принтера из файла настроек в InstalledPrinters; если есть — печатают; если нет — пишут журнал, сообщают пользователю и дают выбрать заново; на принтер по умолчанию молча не переходят
start["При запуске: имя принтера из настроек"]
start --> exists{"Есть в InstalledPrinters?"}
exists -->|"Да"| print["Печать в эту очередь"]
exists -->|"Нет"| log["Журнал и уведомление пользователю"]
log --> pick["Выбрать заново на экране настроек"]
exists -.->|"Нельзя"| silent["Молча перейти на принтер по умолчанию"]
Рис. 20: Реализация, которая при отсутствии молча печатает на другой принтер, даёт аварию, которую находят позже всех.
5.4 Проверка 3: не используют ли виртуальный принтер для порождения файла
Архив форм, который печатает на сторонний PDF-принтер и следит за папкой вывода, и обработка, которая делает промежуточный файл XPS Document Writer, останавливаются, когда используемую очередь WPP удаляет.
Но удаляют программные принтеры, которые WPP не поддерживает. Не смешивать несовместимые продукты типа DLL монитора порта и продукты, уже обновлённые под WPP, вроде OneNote. На шаге 3 главы 7 подтверждают, объект ли удаления фактически используемая очередь.2
Если нужен PDF, как в главе 5 предыдущей статьи, конфигурация прямой генерации библиотекой PDF меньше зависит от изменений стека печати.
5.5 Проверка 4: не идёт ли отправка RAW через очередь, которая при WPP исчезает
Отправка RAW — способ гнать данные языка принтера через спулер: OpenPrinter → StartDocPrinter (тип данных «RAW») → WritePrinter → EndDocPrinter. Сторона документа должна полностью описать настройки печати языком оборудования; настройки DEVMODE не используют.3233
У этикеток и чеков это классика, но отправка RAW — не «прямое общение в обход спулера». Даже если драйвер по сути — проход к порту, исчезновение этой очереди при WPP забирает проход.
flowchart TB
accTitle: Путь отправки RAW и место, которое исчезает при WPP
accDescr: Приложение через OpenPrinter, StartDocPrinter, WritePrinter гонит данные языка принтера в спулер; очередь, которая при WPP не останется (очередь драйвера производителя и т. п.), служит проходом к порту и принтеру, поэтому при WPP исчезновение очереди забирает проход
app["Приложение: StartDocPrinter (RAW), WritePrinter"]
app --> spooler["Спулер"]
spooler --> queue["Очередь, которая при WPP не останется (проход)"]
queue --> port["Порт"]
port --> printer["Принтер этикеток и чеков"]
wpp["Включение WPP"] -.->|"Очередь исчезает"| queue
Рис. 21: Отправка RAW драйвер использует только как проход, но сам проход исчезает.
Подтверждают, в какую комбинацию очереди, драйвера и порта шлют. Не только очередь драйвера производителя: поставляемые драйверы для физических принтеров кроме IPP class driver вроде Generic / Text Only тоже нельзя считать, что останутся. Что в перечне удаления главы 7 подтвердили как исчезающее, так же нуждается в другом пути.13
И что собственный PDL RAW-ом пройдёт в очередь IPP class driver, в Microsoft Learn не написано. Зависит от PDL, который принимает реализация IPP на стороне принтера; «заменим на IPP — те же RAW-данные пройдут» не решают.
6. Лазейка для принтеров этикеток и чеков
Для этикеток и чеков KomuraSoft советует иметь хотя бы один путь вывода без зависимости от спулера.
Даже при исключении подписи главы 2 продолжение поставки драйвера производителя и использование под WPP не гарантируют.1 В разборе неисправностей Microsoft есть случай, когда после обновления 2021 USB-принтеры чеков и этикеток перестали печатать и это сняли Known Issue Rollback.34 Готовность — знать пути вывода раздельно.
| Путь | Зависимость от спулера | Куда подходит и оговорки |
|---|---|---|
| SDK производителя, который общается с устройством напрямую по TCP/USB/последовательному порту | Нет | Модели, чей SDK производитель долго сопровождает. Следят за разрядностью SDK, зависимой средой выполнения, обновлением подписи |
| SDK производителя, который внутри вызывает очередь и драйвер Windows | Да | Даже как существующий актив останавливается, если внутренняя очередь исчезает при WPP. Лазейкой вне спулера не становится |
| Прямая отправка языка принтера сокетом TCP | Нет | Сетевые принтеры этикеток. Проектируют обрыв, повтор, таймаут |
| Прямая отправка последовательным портом (виртуальный COM) / USB | Нет | Принтеры чеков и устройства рядом с измерительным прибором. Предпосылка — выбор виртуального COM, HID, WinUSB |
| Печать через IPP class driver (IPP / IPP over USB) | Да. При выполнении условий совместимо с WPP | Подтверждают сертификацию Mopria, включение и достижимость IPP в сети, режим USB. Путь не выходит за спулер |
В проектирование повторного TCP берут образ мысли ловушек приложений последовательной связи. Выбор способа USB — в как обращаться с USB-устройствами в Windows-приложении. IPP у части принтеров по умолчанию выключен, нужно включать.4
Одного имени SDK мало, чтобы решить, независимый ли путь. Документация SDK и перечень 5.1: общается ли с устройством напрямую или в конце вызывает очередь Windows.
Если пользуются очередью Windows, Universal Print на стороне, совместимой с WPP, но тоже идёт через спулер. Очереди не IPP class driver и не Universal Print при стороннем драйвере, XPS и факсе при WPP останавливаются; поставляемые очереди вроде Microsoft Print to PDF, не названные в перечне удаления, решают отдельно. «Совместимо с WPP» и «без зависимости от спулера» — разные классы.
flowchart TB
accTitle: Поток решения, зависит ли путь вывода от спулера
accDescr: Если кандидат пути шлёт в очередь печати Windows: очередь IPP class driver при сертификации Mopria и, в сети, достижимости включённого IPP, на USB — режиме IPP over USB, и очередь Universal Print как часть Windows Ready Print зависят от спулера, но совместимы с WPP; модели без Mopria, очереди сторонних драйверов и очереди вроде XPS Document Writer и факса, которые таблица главы 4 удаляет, при WPP могут остановиться; поставляемые очереди вроде Microsoft Print to PDF, не названные в перечне удаления, решают отдельно как в 5.1. Если в очередь не шлют: SDK, который внутри вызывает очередь или драйвер, возвращается к тому же решению; SDK, который не вызывает, и путь прямой отправки на устройство — лазейка без зависимости от спулера
route["Кандидат пути вывода"]
route --> q1{"Шлёт в очередь печати Windows?"}
q1 -->|"Да"| q4{"Очередь IPP class driver?"}
q4 -->|"Да"| q5{"Есть сертификация Mopria?"}
q5 -->|"Да"| q9{"IPP достижим? (USB — over USB)"}
q9 -->|"Да"| depok["Зависит, но совместимо с WPP"]
q9 -->|"Нет"| dep["Зависит, при WPP может остановиться"]
q5 -->|"Нет"| dep
q4 -->|"Нет"| q6{"Очередь Universal Print?"}
q6 -->|"Да"| depok
q6 -->|"Нет"| q7{"Таблица главы 4 удаляет?"}
q7 -->|"Да (сторонний драйвер, XPS, факс)"| dep
q7 -->|"Нет (Print to PDF и т. п.)"| indiv["Решать отдельно (5.1)"]
q1 -->|"Нет"| q2{"Через SDK производителя?"}
q2 -->|"Да"| q3{"Внутри вызывает очередь или драйвер?"}
chk["Проверка: документ SDK и перечень 5.1"] -.-> q3
q3 -->|"Да"| q4
q3 -->|"Нет"| indep["Лазейка без зависимости"]
q2 -->|"Нет"| indep
Рис. 22: Решает, через какую очередь в конце; кроме очереди IPP class driver принтера с сертификацией Mopria и очереди Universal Print, кроме поставляемых очередей, не названных в перечне удаления, при WPP могут остановиться.
7. Порядок проверки ── когда WPP используют и когда нет
Сначала ветвь проверки: WPP используют или нет. В обоих случаях оставляют вывод до изменения и подтверждают на фактически используемых назначениях.
flowchart TB
accTitle: Порядок проверки печати, разделённый по использованию WPP
accDescr: На проверочной машине воспроизводят все очереди и сохраняют вывод до изменения; если WPP используют — включают, записывают удалённые очереди, сравнивают вывод после повторной регистрации совместимых и подтверждают другой путь несовместимых; если не используют — физические устройства смены ранга IPP повторно обнаруживают при выключенном режиме и сравнивают вывод, остальные печатают на фактической очереди
prepare["Воспроизвести все очереди и записать"]
prepare --> baseline["Сохранить результат печати до изменения"]
baseline --> use{"WPP используют?"}
use -->|"Да"| enable["Включить и записать удалённые очереди"]
enable --> compatible["Совместимые при необходимости зарегистрировать заново"]
compatible --> compare["Сравнить той же печатью, что до изменения"]
enable --> alternate["Несовместимые — другим путём"]
use -->|"Нет"| physical{"Физическое устройство смены ранга IPP?"}
physical -->|"Да"| redetect["При выключенном удалить и повторно обнаружить"]
redetect --> compare
physical -->|"Нет"| existing["Печать на фактической очереди"]
compare --> finish["Записать результат и восстановить проверочную машину"]
alternate --> finish
existing --> finish
Рис. 23: Вывод до изменения — общая база; включают только среду, где WPP используют. Где не используют — подтверждают смену ранга IPP и печать на фактической очереди.
7.1 Общая подготовка: не на боевом ПК, а на проверочной машине воспроизвести все назначения
Проверяют на ПК Windows 11 24H2 и новее, не на боевом ПК. При сетевом подключении можно проверить на ВМ, которая достигает того же принтера. Повторную регистрацию USB и прямое общение, кроме ВМ с пробросом того же USB, оценивают на физической проверочной машине.
Независимо от использования WPP шагами 1 и 2 оставляют состояние до изменения.
- Воспроизвести все очереди, которыми приложение пользуется на месте. Не только физические принтеры драйвера производителя: сторонние виртуальные PDF-принтеры и поставляемые очереди вроде
Generic / Text Onlyставят той же конфигурацией. Имя и версию драйвера записывают сценарием 5.1. По разнице удаления судят только очереди, которые есть на проверочной машине. - Прогнать функции печати и сохранить вывод. Экран настроек бумаги, лотка, двусторонней печати, числа копий; печать по формам; вывод PDF; печать этикеток — база для сравнения.
flowchart TB
accTitle: Очереди, которые воспроизводят на проверочной машине
accDescr: Из очередей, которыми пользуется приложение по инвентаризации 5.1, на проверочной машине той же конфигурацией, что на месте, воспроизводят физические принтеры драйвера производителя, виртуальные принтеры вроде стороннего PDF, поставляемые очереди вроде Generic / Text Only; перечень удаления шага 3 судит только очереди, которые есть на проверочной машине
inv["Инвентаризация 5.1: очереди приложения"]
inv --> phys["Физический принтер (производителя)"]
inv --> virt["Виртуальный принтер (сторонний PDF и т. п.)"]
inv --> inbox["Поставляемый драйвер (Generic / Text Only и т. п.)"]
phys --> vm["Воспроизвести той же конфигурацией на проверочной машине"]
virt --> vm
inbox --> vm
vm --> judge["По перечню удаления шага 3 решить, останется ли"]
note["Чего нет, в разнице удаления не появится"] -.-> judge
Рис. 24: Очереди, которой нет на проверочной машине, в разнице удаления не будет — сначала воспроизводят все очереди инвентаризации.
7.2 Среда, где WPP используют: включить и проверить и исчезнувшие назначения
После шагов 1 и 2 идут так.
- Включить WPP и записать удаляемые очереди. В «Принтеры и сканеры» приложения «Параметры» пункт «Настройка» Windows protected print mode показывает объекты удаления в диалоге.2 При включении групповой политикой диалога нет: сохраняют результат
Get-Printerдо применения, после применения перезагружают проверочную машину. После подтверждения включенияIsProtectedPrintEnabledили экраном параметров снова берут перечень и записывают разницу.14 - Совместимые удалённые принтеры поставить заново. Входят через Windows Ready Print и сценарием 5.1 подтверждают, что
DriverNameфизического принтера стал Microsoft IPP Class Driver. - Повторить ту же печать и сравнить с выводом до изменения. Выбор экрана настроек, восстановление сохранённых настроек, потерю назначения из-за смены имени очереди. Поля, шрифты, линии вывода сверяют с выводом шага 2.
- Несовместимые печатают другим путём главы 6. Воспроизводят состояние «принтера нет в списке» и подтверждают, что вывод идёт. Объект проверки — не только исправленный код, но и приготовленный путь.
7.3 Среда, где WPP не используют: не включать, проверить смену выбора драйвера
В среде, где решили WPP не использовать, шаги 3 и 4 не делают. Включение WPP удаляет очереди целиком, и влияние одного ранжирования уже не видно.
| Назначение | Что делать после шагов 1 и 2 |
|---|---|
| Физическое IPP-устройство, объект смены ранга | При выключенном WPP на проверочной машине удалить, повторно обнаружить, поставить заново. Сценарием 5.1 подтвердить переход на IPP class driver и сравнить шагом 5 |
| Облачная и виртуальная очередь | Физического устройства для повторного обнаружения и смены ранга нет — подтвердить вывод шага 2 на фактически используемой очереди |
7.4 После проверки восстановить и выстроить порядок киттинга
Проверочную машину, где WPP включали локальным приложением «Параметры», возвращают «выключить». Политику групповой политики или Intune меняет сторона администратора — порядок восстановления готовят под путь включения.213
Выключение WPP само не возвращает принтер, заново поставленный Windows Ready Print. Несовместимые ставят вручную заново.210
В киттинг в механизм раздачи из От групповой политики к Intune — руководство по миграции для малого и среднего бизнеса встраивают политику WPP и порядок повторной регистрации принтеров. Раздача сторонних драйверов Point and Print с KB5005652 2021 по умолчанию требует учётных данных администратора,34 при WPP самой раздачи нет.9 В среде с WPP порядок, зависящий от раздачи драйверов, заменяют этим применением политики и повторной регистрацией.
flowchart TB
accTitle: Пересмотр порядка киттинга
accDescr: Порядок, который раздавал сторонние драйверы Point and Print, с 2021 требует учётных данных администратора, при WPP самой раздачи нет — его убирают; вместо этого в механизм раздачи встраивают политику WPP (групповая политика или OMA-URI) и порядок повторной регистрации принтеров
old["Раздавать сторонние драйверы Point and Print"]
old --> why1["С 2021 нужны учётные данные администратора"]
old --> why2["При WPP самой раздачи нет"]
why1 --> drop["Убрать из порядка"]
why2 --> drop
drop --> add["Встроить политику WPP и порядок повторной регистрации"]
Рис. 25: Порядок раздачи драйверов сменяется порядком раздачи политики WPP и повторной регистрации принтеров.
8. Итог
Нужный ответ решает порядок «останется ли назначение» → «от чего зависит код» → «при каких условиях проверять».
| Результат проверки | Ответ |
|---|---|
| При WPP очередь не остаётся, физический принтер зарегистрировать заново нельзя | Сначала готовят другой путь или решают WPP не использовать |
| Сохраняют настройки драйвера | Сохраняют не состояние, а намерение; сразу перед печатью подтверждают возможности |
| Зависят от имени очереди или виртуального принтера | Готовят проверку существования назначения, журнал, уведомление, выбор заново. PDF порождают напрямую библиотекой |
| Проход отправки RAW при WPP исчезает | Готовят путь без зависимости от спулера |
| Назначение обеспечено, рисуют без зависимости от конкретного драйвера | Не переписывать оптом — проверить фактическим выводом |
Одной правки мало. После настроек продолжают очередь, виртуальный принтер, отправку RAW и в конце главой 7 подтверждают вывод. На устройствах, где WPP не используют, но смена ранга IPP возможна, нужны инвентаризация зависимостей и проверка повторным обнаружением при выключенном WPP.
flowchart TB
accTitle: Дерево решения: переписывать или только проверить
accDescr: Сначала решают, останется ли очередь назначения при WPP (облачная очередь Universal Print, виртуальный принтер с поддержкой WPP) или физический принтер можно зарегистрировать заново через Windows Ready Print; если нет — другой путь или не использовать WPP; если устройство умеет IPP и может смениться ранжированием — по порядку сохранение настроек драйвера, зависимость от имени очереди и виртуального принтера (включая внутри SDK и библиотек), отправка RAW; при совпадении правят и идут дальше; в конце среда с WPP — проверка включением главы 7, без WPP физическое IPP — повторное обнаружение при выключенном, облачные и виртуальные очереди — фактический вывод; без WPP и без влияния смены оставляют нынешний путь
q0{"Очередь при WPP останется или зарегистрировать заново?"}
q0 -->|"Нет"| alt{"Что делать"}
alt -->|"Готовить другой путь"| qi{"IPP и может смениться?"}
alt -->|"WPP не использовать"| qi2{"IPP и может смениться?"}
qi -->|"Да"| q1{"Сохраняют настройки драйвера?"}
qi -->|"Нет"| verify["Только проверить (глава 7)"]
qi2 -->|"Да"| q1
qi2 -->|"Нет"| keep["Оставить нынешний путь"]
q0 -->|"Да"| q1
q1 -->|"Да"| fix1["Править (5.2)"]
fix1 --> q2{"Зависят от имени очереди или виртуального принтера?"}
sdk["Включая зависимость внутри SDK и библиотеки"] -.-> q2
q1 -->|"Нет"| q2
q2 -->|"Да"| fix2["Править (5.3, 5.4)"]
fix2 --> q3{"Шлют RAW в очередь, которая при WPP не останется?"}
q2 -->|"Нет"| q3
q3 -->|"Да"| fix3["Готовить проход (глава 6)"]
fix3 --> vq{"WPP используют?"}
q3 -->|"Нет"| vq
vq -->|"Да"| verify
vq -->|"Нет"| pq{"Физическое IPP-устройство?"}
pq -->|"Да"| redetect["Проверка повторным обнаружением без WPP (7.3)"]
pq -->|"Нет"| outchk["Подтвердить вывод на фактической очереди"]
Рис. 26: Сначала решают, останется ли очередь при WPP; зависимость кода правят по одной и идут к следующей проверке; исправленный путь в конце тоже проверяют. Без WPP не включают WPP главы 7: физическое IPP — повторное обнаружение при выключенном, облачные и виртуальные очереди — фактический вывод.
Срок готовности кладут не на дату Microsoft, а на свой план развёртывания
WPP в будущем станет включён по умолчанию, но срок не указан.10 Срок готовности — до включения WPP у себя или до развёртывания на месте обновления функций Windows 11 24H2 и новее. 1 июля 2027 — веха стороны поставки драйверов, не крайний срок стороны бизнес-приложения.1
flowchart TB
accTitle: Куда класть срок готовности стороны бизнес-приложения
accDescr: Сейчас берут перечень и инвентаризируют; смену пути и проверку заканчивают до своего срока — до включения WPP у себя или до развёртывания обновления функций 24H2 и новее; остановка обновлений драйверов 1 июля 2027 — веха стороны поставки, не срок готовности; состояние, на которое не повлияет включение WPP по умолчанию с неизвестной датой, делают заранее
now["Сейчас: перечень и инвентаризация"]
now --> prep["Смена пути и проверка"]
prep --> deadline["Срок: до включения WPP у себя / до развёртывания обновления функций"]
deadline --> fine["Включение WPP по умолчанию (срок неизвестен) уже не заденет"]
ms["1 июля 2027: остановка обновлений драйверов"] -.->|"Веха стороны поставки, не срок"| prep
Рис. 27: Срок кладут на свой план развёртывания, веху Microsoft крайним сроком не делают.
Начинают с перечня на стороне поставки и понимания зависимостей настроек, назначения и пути вывода. PDF порождают напрямую; у этикеток и чеков есть один путь вне стека печати. Затем печать подтверждают под фактическими условиями развёртывания.
Среды, оставшиеся на Windows 10, вне этого плана, но поддержка обычного канала Windows 10 (22H2) кончилась в октябре 2025. У Enterprise LTSC и IoT Enterprise LTSC сроки по редакциям разные — смотрят жизненный цикл. Решение с ESU и LTSC — в реальных вариантах после окончания поддержки Windows 10, промышленные ПК — в какой Windows ставить на промышленный ПК. Готовность печати — до повторной проверки главы 7 на Windows 11, куда переходят.
Похожие статьи
- Печать и PDF в Windows-приложениях: PrintDocument, WPF и библиотеки отчётов
- Как строить вывод форм Excel — COM / Open XML / шаблон
- Как создать и эксплуатировать службу Windows — от выбора между Планировщиком заданий и службой до превращения BackgroundService в службу
- Как обращаться с USB-устройствами в Windows-приложении ── выбор виртуального COM, HID, WinUSB
- Ловушки приложений последовательной связи — до повторного подключения и проектирования журнала
- От групповой политики к Intune — руководство по миграции для малого и среднего бизнеса
- Реальные варианты после окончания поддержки Windows 10 ── решение ESU, LTSC, замены
Смежные области консультирования
Компания KomuraSoft LLC занимается инвентаризацией зависимости бизнес-приложений с печатью форм и этикеток от драйвера принтера, пересмотром пути печати (прямая генерация PDF, прямое управление принтером этикеток), проектированием плана проверки исходя из Windows protected print mode.
Справочные ссылки
-
Microsoft Learn, End of servicing plan for third-party printer drivers on Windows. Временная линия обновления мая 2025 (15 января 2026, 1 июля 2026, 1 июля 2027); объект — Windows 11 и новее и Windows Server 2025 и новее; существующие драйверы можно ставить, плана отключать функции v3/v4 нет; три условия исключения подписи (без сертификации Mopria, верхняя граница Windows 10 и ниже, машинный ARM64); USB-устройства каждую функцию используют только в режиме IPP over USB; с Windows 10 21H2 поставляется Microsoft IPP Class Driver. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Microsoft Learn, Overview of Windows protected print mode. О том, что при включении принтеры на сторонних драйверах удаляют и убирают из хранилища драйверов; принтер с сертификацией Mopria, введённый сторонним драйвером, нужно ставить заново; удаляют неподдерживаемые программные принтеры (OneNote (Desktop) и т. п.), XPS, факс; при включении групповой политикой пользователь не снимет; порядок включения и выключения из приложения «Параметры». ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Step 2: A Driver Package for the Device is Selected. О том, что при нескольких подходящих пакетах драйверов Windows ставит каждому ранг и ставит с лучшим рангом; при равном ранге выбирают по дате и версии. ↩
-
Microsoft Learn, IPP printers with the Universal Print Connector. Microsoft IPP Class Driver — поставляемый драйвер, который общается с принтерами с сертификацией Mopria по IPP; у части принтеров IPP по умолчанию выключен и его нужно включать. ↩ ↩2
-
Microsoft Learn, Legacy printer driver submission process. О том, что с 15 января 2026 подачу драйверов принтера независимо от WHQL и Attestation по умолчанию блокируют; ручной разбор — с документом обоснования. ↩
-
Microsoft Learn, Windows Print Path Overview. О двух основных путях печати Windows: путь GDI и путь XPS. ↩
-
Microsoft Learn, Discover Windows Ready Print. О том, что Windows Ready Print — имя, включающее IPP, eSCL, Universal Print; сторонний драйвер не нужен; спроектирован для принтеров с сертификацией Mopria; не зависит от архитектуры ПК. ↩
-
Microsoft Learn, Universal Print troubleshooting - Understanding the stages of a print job. Принтер Universal Print пользуется поставляемым Universal Print class driver; спулер шлёт задание в службу IPP over HTTPS. ↩ ↩2 ↩3
-
Microsoft Learn, More information on Windows protected print mode for enterprises and developers. Сбои печати — 9% сообщений MSRC за три года; спулер работает как SYSTEM и загружает сторонний код; старые драйверы несовместимы с CFG/CET/ACG; IPP на HTTP POST, опознают URI, немногие PDL вроде PWG Raster и PDF рендерят на клиенте; при WPP ограничение загрузки модулей, рендер XPS с правами пользователя, ограниченный маркер, запрет порождения дочерних, смягчение двоичных файлов; Point and Print сторонние драйверы больше не ставит. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, Windows protected print mode FAQ. О том, что несовместимый принтер пока включён заново не поставить, после выключения ставят вручную; собственные функции дают Print Support App; Windows protected print mode в будущий момент станет включён по умолчанию. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Printer driver isolation. Смысл режимов изоляции (Shared / Isolated / None); драйвер без ключевого слова
DriverIsolationв INF по умолчанию работает в процессе спулера; администратор может переопределить настройку каждого драйвера консолью управления печатью или функциями спулера. ↩ ↩2 -
Microsoft Learn, What’s new in Windows 11, version 24H2. О том, что Windows protected print mode добавлен в 24H2 и включается приложением «Параметры» или групповой политикой. ↩
-
Microsoft Learn, Policy CSP - Printers: ConfigureWindowsProtectedPrint. ОС применения — Windows 11 24H2 и новее; по умолчанию выключен, драйверы и функции печати не ограничивают; соответствующий ключ реестра ADMX
Software\Policies\Microsoft\Windows NT\Printers\WPPи значениеWindowsProtectedPrintGroupPolicyState. ↩ ↩2 ↩3 ↩4 ↩5 -
Microsoft Learn, Windows protected print mode for enterprises. Порядок включения групповой политикой «Configure Windows protected print»; OMA-URI Intune; с клиента с включённым WPP сервер с выключенным WPP консолью управления печатью не ведут. ↩ ↩2 ↩3
-
Microsoft Learn, WindowsProtectedPrintInfo.IsProtectedPrintEnabled Property. Статическое свойство, введённое в Windows 11 24H2, которое возвращает, включён ли WPP на текущем устройстве. ↩
-
Microsoft Learn, Get-PrinterDriver. Возвращает перечень драйверов принтера указанного компьютера; учётные данные администратора не нужны. ↩
-
Microsoft Learn, PnPUtil Command Syntax.
/enum-driversперечисляет сторонние пакеты драйверов; с Windows 11 21H2/classсужает по имени класса; запускают от администратора в командной строке. ↩ ↩2 -
Microsoft Learn, How to display printer status in a UWP device app. Порядок отличить v3 и v4 через
get-printer | Select Name, {(get-printerdriver -Name $_.DriverName).MajorVersion}. ↩ -
Microsoft Learn, PnPUtil. При перечислении пакетов хранилища драйверов поставляемые (in-box) пакеты не входят; перечисляют только пакеты кроме поставляемых. ↩
-
Microsoft Learn, PrintQueue.QueueDriver Property. Драйвер принтера, которым пользуется очередь, получают как
PrintDriver. ↩ -
Microsoft Learn, PrintServer Class. Классы пространства имён
System.Printingвнутри служб Windows и приложений ASP.NET не поддерживаются и могут дать падение производительности или исключение во время выполнения. ↩ -
Microsoft Learn, DEVMODEW structure (wingdi.h). Сразу за открытыми членами можно положить закрытые члены драйвера; размер показывает
dmDriverExtra; Windows проверяет только открытую часть; испорченные закрытые данные могут уронить драйвер. ↩ -
dotnet/winforms (GitHub), PrinterSettings.cs.
SetHdevmodeкопирует внутрь закрытую область наdmDriverExtra,GetHdevmodeеё записывает обратно; другими путями закрытой области нет. ↩ -
Microsoft Learn, PrinterSettings Class. В объявлении версии .NET Framework есть атрибут
Serializable, в версии .NET нет;GetHdevmodeиSetHdevmodeвзаимно преобразуют сDEVMODE. ↩ ↩2 -
Microsoft Learn, SerializableAttribute Class. У типа с атрибутом
Serializableпо умолчанию сериализуются все поля, закрытые и открытые; исключают атрибутомNonSerialized. ↩ -
Microsoft Learn, PaperSize.RawKind Property.
RawKind— целое, означающее значение стандартного вида бумаги или своё значение. ↩ -
Microsoft Learn, PaperSourceKind Enum. Кроме стандартных видов источника вроде
UpperиLowerопределёнCustomдля источника, свойственного принтеру. ↩ ↩2 -
Microsoft Learn, Print Schema. Print Schema допускает расширения третьей стороны; частный элемент Property должен принадлежать пространству имён, явно связанному с этой третьей стороной. ↩
-
Microsoft Learn, Print Schema-Related Technologies. PrintTicket — преемник
DEVMODE; PrintTicket устройства может включать частные расширения конкретной модели. ↩ -
Microsoft Learn, How to: Validate and Merge PrintTickets. Порядок подтвердить возможности принтера
PrintQueue.GetPrintCapabilitiesи слить и проверить требование в действительныйPrintTicketпринтера черезMergeAndValidatePrintTicket. ↩ -
Microsoft Learn, ConflictStatus Enum.
MergeAndValidatePrintTicketможет дать драйверу подменить неподдерживаемые настройки и вернуть действительный билет; подмену сообщаетConflictResolvedуValidationResult.ConflictStatus. ↩ -
Microsoft Learn, WritePrinter function. Порядок от
StartDocPrinterдоEndDocPrinter; при типе данных «RAW» документ языком оборудования должен полностью описать настройки, равносильныеDEVMODE;WritePrinter— блокирующая функция, вызов с потока UI может выглядеть как «не отвечает». ↩ -
Microsoft Learn, RAW data type. Данные RAW без дальнейшей обработки идут на монитор печати; пример — файл из команд PCL. ↩
-
Microsoft Learn, Printing issue troubleshooting guidance. Смена поведения Point and Print по умолчанию с KB5005652 требует учётных данных администратора; после обновления 2021 USB-принтеры чеков и этикеток перестали печатать, сняли Known Issue Rollback. ↩ ↩2
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Печать и PDF в Windows-приложениях: PrintDocument, WPF и библиотеки отчётов
Печать WinForms через PrintDocument, печать WPF через FlowDocument и FixedDocument и варианты вывода PDF сведены в таблицу по требованиям...
Локализация WinForms и WPF: resx, спутниковые сборки, переключение культуры
Разбираем локализацию десктопных приложений Windows: чем CurrentCulture отличается от CurrentUICulture, как устроены resx и спутниковые с...
Аутентификация Entra ID в WinForms и WPF: MSAL.NET и брокер WAM
Как добавить вход через Entra ID в десктопное приложение WinForms или WPF: общедоступный клиент, регистрация приложения, AcquireTokenSile...
Что продумать перед заказом разработки Windows-приложения
Перед заказом разработки Windows-приложения разберём, что стоит прояснить: доработка существующего ПО, интеграция с оборудованием, COM/Ac...
Тёмный режим и темы контрастности в приложениях Windows ── тёмная панель заголовка DWM, следование системной теме в WinForms/WPF, отрисовка при высокой контрастности
Как заставить приложения WinForms и WPF следовать тёмному режиму и темам контрастности Windows 11. Тёмная панель заголовка DWM, SetColorM...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Поток UI и таймеры
Поток UI WPF / WinForms, асинхронные операции, Dispatcher и проектирование таймеров.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Пересмотр и доработка пути печати бизнес-приложения с формами и этикетками входят в консультации по разработке приложений для Windows.
Технические консультации и ревью дизайна
Инвентаризация зависимости существующих приложений от драйвера принтера и ревью дизайна порядка замены входят в технические консультации.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Работающие сейчас принтеры и приложения внезапно перестанут печатать после июля 2026 или июля 2027?
- Нет. План Microsoft прямо описан как поэтапное прекращение со стороны поставки: «новые сторонние драйверы не класть в Windows Update», «ранжированием предпочитать IPP class driver», «обновления не принимать» — не как отключение существующих драйверов. Существующие драйверы по-прежнему ставят установщиком производителя. Опасно, когда IPP class driver подходит к устройству и при замене ПК или переустановке ОС драйвер сам сменяется на IPP class driver, и когда включают Windows protected print mode.
- Windows protected print mode по умолчанию включён?
- На момент написания статьи (сентябрь 2026) по умолчанию выключен; включают в приложении «Параметры», групповой политикой или Intune. Но FAQ Microsoft прямо говорит: «в будущий момент станет включён по умолчанию». Срок не указан, поэтому готовность — заранее сделать состояние, в котором включение не остановит работу.
- Что будет с принтерами этикеток и чеков?
- Принтеры без сертификации Mopria названы среди условий, при которых после 15 января 2026 подпись драйвера ещё могут признать как исключение. То есть драйвер производителя пока может остаться, но в среде с включённым Windows protected print mode принтеры на сторонних драйверах удаляют, как есть не поработают. Путь через SDK производителя, который общается с устройством напрямую по TCP/USB/последовательном порту, или прямая отправка языка принтера отвязывает от изменений спулера. SDK, который внутри вызывает очередь или драйвер Windows, при исчезновении стороннего драйвера остановится так же и лазейкой не станет.
- Код печати приложения можно оставить на PrintDocument?
- Пути печати GDI и XPS остаются; Microsoft прямо говорит, что отключать функции драйверов v3/v4 не планирует. Приложение, которое только рисует через PrintDocument или FixedDocument, — объект проверки, не переписывания. Переписывать — код, который сохраняет и восстанавливает настройки драйвера (закрытую часть DEVMODE или частное пространство имён PrintTicket), зависит от конкретного имени очереди или виртуального принтера (включая то, что внутри вызывает SDK производителя или библиотека форм), и гонит RAW через спулер в очередь, которая при WPP не останется (очередь драйвера производителя и т. п.). Но если сам принтер назначения нельзя зарегистрировать заново через Windows Ready Print, даже при одном рисовании под Windows protected print mode очередь исчезнет целиком — сначала готовят другой путь.
- С чего начинать?
- С перечня принтеров и драйверов на стороне поставки. Get-Printer и Get-PrinterDriver PowerShell без прав администратора показывают, какая очередь каким драйвером пользуется (v3 или v4, IPP class driver). Затем сверяют очереди, к которым приложение обращается по имени, сохраняет настройки или шлёт RAW, и по таблице решений статьи раскладывают на «как есть», «проверить», «сменить путь».
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.