Windows 列印驅動程式停止提供 ── 業務應用程式的報表與標籤列印如何因應

· 更新日期: · · Windows, Windows 開發, Windows 11, CSharp, .NET, WinForms, WPF, 列印, 報表, 列印驅動程式, IPP, 維運, 技術諮詢

「換了新電腦之後,明明是同一台印表機,紙張與紙匣的選項卻不一樣」「儲存好的列印設定還原不回來」「標籤印表機從清單裡消失了」。為列印驅動程式的停止提供做準備,就是讓這些變化發生時業務也不會停下來。

首先要掌握的是,驅動程式的停止提供計畫,和啟用 Windows protected print mode 是兩回事。並不是計畫的日期一過,既有的列印就會一起停止。另一方面,在驅動程式的選用方式改變的情境,以及啟用 Windows protected print mode 的情境中,應用程式原本相依的設定與列印目標會失去。12

本文面向維護 WinForms、WPF 等 Windows 業務應用程式的開發者,以及配置印表機的管理者,依 什麼會變、要查什麼、改哪裡、怎麼驗證 的順序整理。列印 API 與 PDF 輸出方式本身的取捨,請參閱上一篇Windows 業務應用程式的列印與 PDF 輸出

前提環境是 Windows 11(WPP 的驗證需要 24H2 以後)、PowerShell 5.1 以上(PrintManagement 模組)、C#(.NET 6 以上或 .NET Framework 4.x,System.Drawing.Printing / System.Printing)。難度為中級

1. 先講結論

不要一律重寫列印程式碼,而是先確認「列印目標會不會留下來」,之後再修改相依於驅動程式的地方。

判斷的順序分成下面 3 個階段。

順序 要確認的事 下一步行動
1. 確認列印目標 佇列在 WPP 之下會不會留下。實體印表機能不能用 Windows Ready Print 重新註冊 如果不會留下,就先準備另一條輸出路徑,或者先做出不使用 WPP 的判斷
2. 確認應用程式的相依 是否相依於驅動程式專屬設定、佇列名稱、虛擬印表機、RAW 傳送 修改相符的地方。也要納入 SDK 與報表函式庫內部的相依
3. 用實際輸出確認 即使驅動程式或佇列變了,報表、PDF、標籤能不能正確輸出 使用 WPP 的環境要啟用後驗證,不使用的環境依另一套步驟驗證

如果只是用 PrintDocumentFixedDocument 繪製,基本上屬於 驗證對象而非改造對象。不過,如果列印目標的佇列本身在 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. 究竟定了什麼 ── 3 個階段的時程

2.1 結束的是供給與更新,而不是讓既有驅動程式一起停止

第一手資料是 Microsoft Learn 的「End of servicing plan for third-party printer drivers on Windows」。計畫在 2023 年 9 月公布,2025 年 5 月修訂了日期。撰寫本文時的計畫如下。1

時程 會變更的內容 業務應用程式端要注意的事
2026年1月15日 在 Windows 11 以後與 Windows Server 2025 以後,不再把新的列印驅動程式放上 Windows Update。既有驅動程式的更新可透過個別審查進行 配置新電腦、新印表機時,未必還能用以往的方式取得廠商提供的驅動程式
2026年7月1日 把列印驅動程式的排名改成一律優先選用 Windows 內建的 IPP 類別驅動程式 在 IPP 類別驅動程式也相符的機器上,更換電腦或重新偵測印表機時可能選中別的驅動程式
2027年7月1日 除了安全性修正之外,不再受理第三方列印驅動程式的更新 不要把停止更新的日期誤當成應用程式端的準備期限

既有驅動程式仍可從 Windows Update 或廠商提供的安裝程式安裝,Microsoft 表示沒有停用 v3/v4 驅動程式功能的計畫。也就是說,這是一個 分階段結束驅動程式供給與更新的計畫,而不是在那一天把現場電腦裡已安裝的驅動程式停用的計畫。1

驅動程式停止提供會改變什麼、不會改變什麼單靠列印驅動程式的停止提供本身,應用程式繪製 API 的入口與既有驅動程式不會改變,只有在新導入或重新偵測時選中別的驅動程式,驅動程式回傳的紙張清單、專屬功能與佇列名稱才會被替換,而包含虛擬印表機被刪除在內的、由啟用 Windows protected print mode 帶來的變化屬於另一套機制,在第 4 章說明列印驅動程式的停止提供不會改變的東西新導入、重新偵測時選中別的驅動程式會被替換的東西繪製 API 的入口既有驅動程式紙張、紙匣、專屬功能佇列名稱

圖 1: 單靠停止提供不會改變任何東西,只有在選中別的驅動程式時,驅動程式原本提供的資訊與名稱才會被替換。包含虛擬印表機被刪除在內的、啟用 WPP 帶來的變化屬於另一套機制(第 4 章)。

2.2 現場中驅動程式會被換掉,主要是兩個情境

即使計畫不會停掉既有驅動程式,在下面的情境中應用程式看到的環境也會改變。

情境 會發生什麼
更換電腦、重新安裝作業系統、重新偵測印表機 若該機器也與 IPP 類別驅動程式相符,排名規則會讓系統選中與以往不同的驅動程式
啟用 WPP 使用第三方驅動程式的印表機會被刪除。相容機種以 Windows Ready Print 重新註冊,不相容機種照原樣就無法使用

當同一個裝置有多個驅動程式套件相符時,Windows 會為每一個評定排名(rank),並選出最好的那一個。2026 年 7 月 1 日的變更,就是在這個選擇中優先選用 IPP 類別驅動程式。在 IPP 類別驅動程式不會成為候選的機器上,廠商的驅動程式套件仍可能繼續被選中。31

現場中驅動程式被替換的兩條路徑在與 IPP 類別驅動程式相符的機器上,更換電腦、重新安裝作業系統、重新偵測印表機時排名規則會選中 IPP 類別驅動程式而使驅動程式被替換,啟用 Windows protected print mode 時使用第三方驅動程式的印表機會被刪除,能以 Windows Ready Print 重新註冊的機種驅動程式被替換,不能重新註冊的機種則列印目標消失可以不行現場的電腦更換電腦、重新安裝作業系統、重新偵測啟用 Windows protected print mode在與 IPP 類別驅動程式相符的機器上優先選它刪除使用第三方驅動程式的印表機驅動程式被替換能否以 Ready Print 重新註冊列印目標消失

圖 2: 把停止提供計畫與 WPP 分開來看,就能區分「驅動程式被換掉」的情境和「列印目標本身失去」的情境。

這裡還有一點很重要:不要把支援 IPP 與取得 Mopria 認證當成同一個條件

條件 主要用來判定什麼
IPP 類別驅動程式與該機器相符 排名規則的變更是否可能導致驅動程式被替換
已取得 Mopria 認證,網路連線時 IPP 已啟用且可到達,USB 連線時處於 IPP over USB 模式 實體印表機能否在 WPP 之下以 Windows Ready Print 重新註冊

在未取得 Mopria 認證但支援 IPP 的機器上,即使不使用 WPP,也可能因排名規則的變更而被替換驅動程式。反過來說,光是驅動程式名稱為「Microsoft IPP Class Driver」,並不等於已經確認它在 WPP 之下能用。14

與 IPP 類別驅動程式相符和取得 Mopria 認證是不同的條件印表機只要支援 IPP,排名規則變更後就可能被選中 IPP 類別驅動程式而替換驅動程式,而是否取得 Mopria 認證是另一個條件,它決定能否在 Windows protected print mode 之下重新註冊,網路連線機種需要 IPP 已啟用且可到達,USB 連線機種需要處於 IPP over USB 模式印表機是否支援 IPP可能被替換維持廠商驅動程式是否已取得 Mopria 認證無法在 WPP 之下重新註冊是否為 USB 連線IPP 是否啟用且可到達可以在 WPP 之下重新註冊是否為 IPP over USB 模式

圖 3: 排名規則的影響取決於是否支援 IPP,而能否在 WPP 之下留下來,則取決於 Mopria 認證再加上 IPP 已啟用且可到達(USB 連線時為 IPP over USB 模式)。

2.3 驅動程式簽章有例外,但不保證能延續

2026 年 1 月 15 日之後,符合下列任一條件的驅動程式,仍可把簽章的例外申請送入個別審查。1

  • 給無法取得 Mopria 認證的印表機使用。
  • 以 Windows 10 以下作為目標作業系統上限的套件。
  • 原生 ARM64 驅動程式。

無論 WHQL 或 Attestation,提交都會被預設封鎖,需附上正當性說明文件進行人工審查。即使符合條件,也不保證廠商會提交、Microsoft 會核准。5 另外,能取得已簽章的驅動程式,和能在啟用 WPP 的環境中使用,是兩回事。標籤印表機與收據印表機的因應在第 6 章說明。

2026 年 1 月 15 日之後仍可取得驅動程式簽章的條件廠商提交驅動程式預設會被封鎖,只有符合無法取得 Mopria 認證的印表機、以 Windows 10 以下為上限的套件、原生 ARM64 驅動程式這三個條件之一的才能把例外申請送入個別審查,而經過審查也只是有可能核准,並不保證一定會被簽章廠商提交驅動程式預設被封鎖無法取得 Mopria 認證的機種上限為 Windows 10 以下原生 ARM64可以提出例外申請個別審查有可能核准(沒有保證)

圖 4: 即使符合條件也只是能送進審查,會不會被簽章並沒有保證。

3. 機制 ── 傳統的驅動程式路徑與 Windows Ready Print

3.1 改變的是繪製 API 之後的列印路徑

在傳統的 Windows 列印中,應用程式送出 GDI 或 XPS 的繪製指令,列印多工緩衝處理器接收工作,列印驅動程式再把它轉換成印表機的語言(PDL)送出去。GDI 列印路徑與 XPS 列印路徑都建立在這個結構之上。6

傳統的驅動程式路徑業務應用程式的 GDI 或 XPS 繪製指令由以 SYSTEM 權限執行的列印多工緩衝處理器排入多工緩衝,第三方的 v3 或 v4 驅動程式在沒有驅動程式隔離時就在列印多工緩衝處理器本體之中、在共用或隔離時則在與列印多工緩衝處理器不同的處理程序中,把它轉換成專屬的 PDL 送往印表機共用 / 隔離業務應用程式(GDI / XPS)列印多工緩衝處理器(SYSTEM 權限)驅動程式隔離為在列印多工緩衝處理器本體中執行第三方驅動程式在另一個處理程序中執行第三方驅動程式轉換成專屬 PDL印表機

圖 5: 在傳統路徑中,隔離與否會改變處理程序,但在列印堆疊裡由第三方程式碼負責 PDL 轉換這個結構是相同的。

作為它的後繼而準備的,就是 Windows Ready Print。它是把以 IPP(Internet Printing Protocol)進行的列印、以 eSCL 進行的掃描以及 Universal Print 整合起來的稱呼,不需要第三方驅動程式。它是為已取得 Mopria 認證的印表機設計的,而且不相依於 CPU 架構,這也是它的優點。7

Windows 10 21H2 以後內建了以網路與 USB 方式處理 Mopria 相容印表機的 Microsoft IPP Class Driver1 Universal Print 的雲端佇列則使用內建的 Universal Print Class Driver8

Windows Ready Print 的路徑業務應用程式的繪製指令由列印多工緩衝處理器接收,內建的 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 的路徑只允許 Ready Print 的路徑業務應用程式(GDI / XPS)列印多工緩衝處理器Microsoft IPP Class Driver算繪成 PWG Raster / PDF已取得 Mopria 認證的印表機(IPP)Universal Print Class DriverUniversal Print 服務(IPP over HTTPS)Windows protected print mode

圖 6: Windows Ready Print 同樣會經過列印多工緩衝處理器。改變的是負責轉換與傳送的角色,從第三方驅動程式換成了內建的類別驅動程式。

IPP 是以 HTTP 為基礎的通訊協定,用 ipps://printer.example.com/ipp/print 這樣的 URI 來識別印表機。免驅動列印所用的 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 的列印支援,就斷定傳真與掃描也能一起轉移。

分別確認多功能事務機各功能的順序逐一選出要使用的功能,依序確認機器是否搭載、是否支援表中的通訊協定、USB 連線時是否處於 IPP over USB 模式,不要把列印功能的結果套用到傳真或掃描,其餘功能也要分別確認選出一個要使用的功能機器是否搭載該功能?是否支援表中的通訊協定?此功能的條件未滿足是否為 USB 連線?是否為 IPP over USB 模式?此功能的條件已確認其餘功能分別確認

圖 7: 依功能是否搭載、是否支援通訊協定、連線方式的追加條件的順序確認。不要把列印的確認結果套用到傳真或掃描。

3.3 背後的原因是列印堆疊的安全性

在 Microsoft Learn 的說明中,列印相關的問題占該說明所統計的過去三年 MSRC(Microsoft Security Response Center)通報案例的 9%。列印多工緩衝處理器以 SYSTEM 權限運轉,標準使用者也能廣泛接觸,而且會依需求載入第三方程式碼。有些舊驅動程式與 CFG、CET 等現代緩解措施不相容,形成了難以套用「需要所有參與者都支援」那類緩解措施的結構。9

只要還載入第三方驅動程式,緩解措施就無法生效的原因以 SYSTEM 權限運轉的列印多工緩衝處理器會載入第三方程式碼,而舊驅動程式與 CFG、CET 等緩解措施不相容,因此需要所有參與者都支援的緩解措施無法套用到列印多工緩衝處理器上,漏洞也就更容易被利用列印多工緩衝處理器以 SYSTEM 權限運轉依需求載入第三方程式碼舊驅動程式與緩解措施不相容漏洞容易被利用無法套用緩解措施(CFG / CET / ACG)

圖 8: 緩解措施要所有參與者都支援才會生效,因此不把驅動程式移出去,就守不住列印多工緩衝處理器。

第三方驅動程式執行的位置,由 列印驅動程式隔離 的設定決定。11

隔離模式 驅動程式執行的位置
無(None) 列印多工緩衝處理器本體的處理程序內
共用(Shared) 與列印多工緩衝處理器不同、並與其他驅動程式共用的處理程序
隔離(Isolated) 驅動程式專用的獨立處理程序

在 INF 中宣告 DriverIsolation=2 的驅動程式預設使用共用處理程序,沒有宣告的驅動程式預設在列印多工緩衝處理器本體中執行。系統管理員可以透過列印管理主控台或群組原則覆寫。不過無論哪一種模式,第三方程式碼都在列印堆疊之中執行這一點不會改變。11 WPP 就是把這種對第三方程式碼的相依拿掉的運作模式。

第三方驅動程式在哪個處理程序中執行是如何決定的在 INF 中宣告 DriverIsolation=2 的驅動程式預設在與列印多工緩衝處理器不同的共用處理程序中執行,沒有宣告的驅動程式預設在列印多工緩衝處理器本體中執行,系統管理員可以透過列印管理主控台或群組原則覆寫成共用、列印多工緩衝處理器本體之中、驅動程式專用的獨立處理程序(隔離)三者之一在 INF 中宣告 DriverIsolation=2在另一個共用處理程序中執行(預設)在列印多工緩衝處理器本體中執行(預設)由系統管理員的設定或原則覆寫在專用的獨立處理程序中執行(隔離)

圖 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 由系統管理員變更原則

若是透過群組原則啟用的,使用者不聯絡系統管理員就無法解除。Intune 的 OMA-URI 也是套用同一套以 ADMX 為基礎的裝置原則的途徑。能由本人在設定畫面改回去的,只有本人在設定畫面啟用的情況,請這樣理解。14213

啟用 Windows protected print mode 的三條途徑可以透過設定應用程式、群組原則、Intune 的 OMA-URI 之一啟用 Windows protected print mode,能由本人在設定應用程式中改回去的只有本人在設定應用程式中啟用的情況,透過群組原則或 Intune 的原則派送的情況必須由系統管理員端變更原則才能解除本人可在設定應用程式中改回本人無法改回本人無法改回設定應用程式(本人啟用)Windows protected print mode 已啟用群組原則Intune(OMA-URI)解除解除需系統管理員端變更原則

圖 10: 啟用有三條途徑,能由本人改回去的只有本人在設定應用程式中啟用的情況。

4.2 會留下的佇列、會消失的佇列、需要重新註冊的佇列

啟用時的影響不只取決於印表機本身,還取決於 現在是用哪個驅動程式註冊的2

目前的列印目標 啟用 WPP 之後 因應方式
以第三方驅動程式(v3/v4)註冊的實體印表機 佇列被解除安裝,驅動程式也從驅動程式存放區中刪除 相容機種以 Windows Ready Print 重新註冊。不相容機種則選擇另一條路徑或不使用 WPP
雖已取得 Mopria 認證,但以廠商驅動程式註冊的印表機 會先被刪除一次。並不是取得認證既有佇列就會留下 網路連線要確認 IPP 已啟用且可到達,USB 連線要確認處於 IPP over USB 模式,然後重新註冊
已以 Windows Ready Print 註冊的相容印表機 可以繼續使用 驗證能力、設定與實際輸出
Universal Print 的雲端佇列 作為 Windows Ready Print 的一部分,位於 WPP 相容的一側 確認應用程式對佇列名稱的相依,並驗證實際輸出
不受支援的軟體印表機 會被刪除 第三方 PDF 印表機等要確認產品是否支援 WPP。報表封存應轉向以 PDF 函式庫直接產生
已更新為支援 WPP 的虛擬印表機 不要和不支援的產品一概而論。OneNote 備有 Protected virtual printer 驗證使用中的產品與佇列屬於哪一種
Microsoft XPS Document Writer、傳真的虛擬印表機 會被刪除 把 WPP 改回停用之後,XPS 從「Windows 功能」、傳真從「Windows 傳真和掃描」的選用功能中手動重新裝回
啟用 Windows protected print mode 時印表機會發生什麼啟用後以第三方驅動程式導入的印表機、不受支援的虛擬印表機、XPS Document Writer 與傳真的虛擬印表機會被刪除,已取得 Mopria 認證且網路連線時 IPP 已啟用且可到達、USB 連線時處於 IPP over USB 模式的機種可以用 Windows Ready Print 重新註冊,不支援的機種在啟用期間無法使用網路USB啟用 WPP刪除使用第三方驅動程式的印表機刪除不支援的虛擬印表機XPS Document Writer 與傳真也被刪除是否已取得 Mopria 認證連線方式為IPP 是否啟用且可到達是否為 IPP over USB 模式以 Windows Ready Print 重新註冊啟用期間無法使用

圖 11: 以廠商驅動程式建立的佇列,即使已取得 Mopria 認證也會先消失一次。能否重新註冊要另外確認條件。

在 WPP 啟用期間,被刪除的第三方驅動程式不能使用。另外,即使把 WPP 改回停用,以 Windows Ready Print 重新裝好的印表機也不會自動變回原本的驅動程式。210

在應用程式端,以廠商驅動程式回傳的紙張、紙匣、專屬功能,以及連接埠監視器 DLL 型的虛擬印表機、XPS Document Writer 為前提的處理,都是確認對象。以 XpsDocument 等直接產生 XPS 檔案的處理,和向 XPS Document Writer 這個虛擬佇列列印是兩回事,不屬於這次刪除的對象。

4.3 管理與列印多工緩衝處理器內部也有變更

在 WPP 之下,不再載入連接埠監視器 DLL 等第三方二進位檔。AddPrintProvidorW 這類模組載入 API 也無法載入新模組,只會載入 IPP 所需的、由 Microsoft 簽署的二進位檔。AddPrintProvidorW 是 winspool.h 沿用下來的歷史拼寫,Microsoft Learn 的說明中寫作 AddPrintProviderW。9

由於這些限制,XPS 的算繪改成以使用者權限執行而不再是 SYSTEM,新的列印多工緩衝處理器背景工作處理程序使用去除了 SeTcbPrivilege 等權限的受限權杖。子處理程序的建立被禁止,CFG、CET、ACG 也會啟用。9

Windows protected print mode 之下列印多工緩衝處理器的變化由於不再載入第三方二進位檔,就能做到模組載入的限制、以使用者權限算繪 XPS、使用受限權杖的背景工作處理程序、禁止建立子處理程序以及啟用 CFG、CET、ACG不載入第三方二進位檔載入的限制權限的縮減緩解措施的啟用只載入 Microsoft 簽署的二進位檔使用者權限的 XPS、受限權杖禁止子處理程序、CFG / CET / ACG

圖 12: 圖 8 中無法生效的緩解措施,要把第三方二進位檔移出去之後才能啟用。

Point and Print 雖然保留了 IPP 設定,但不再安裝第三方驅動程式。那些以「連線到列印伺服器就會派送驅動程式」為前提的裝機程序,也需要重新檢視。9

WPP 目前是否啟用,可以用 Windows 11 24H2 以後的 WinRT API Windows.Graphics.Printing.ProtectedPrint.WindowsProtectedPrintInfo.IsProtectedPrintEnabled 確認。15 群組原則的設定值位於 HKLM\Software\Policies\Microsoft\Windows NT\Printers\WPP 底下的 WindowsProtectedPrintGroupPolicyState13

另外,從啟用了 WPP 的用戶端,無法以列印管理去管理未啟用 WPP 的列印伺服器。要為管理人員另外準備一台停用 WPP 的管理用用戶端。14

5. 既有應用程式的盤點 ── 要看的 4 個地方

業務應用程式中要盤點的 4 個地方業務應用程式的列印程式碼中,儲存驅動程式專屬設定、相依於佇列名稱(包含 SDK 與函式庫內部的)、相依於 WPP 不支援的虛擬印表機、向 WPP 之下不會保留的佇列做 RAW 傳送這 4 個地方是改造對象,只做繪製的程式碼則是驗證對象業務應用程式的列印程式碼盤點 4 類相依只做繪製儲存專屬設定相依於佇列名稱相依於虛擬印表機RAW 傳送包含 SDK 內部WPP 不支援的那些送往不會保留的佇列改造驗證

圖 13: 只有這 4 類相依是改造對象,只做繪製的程式碼交給驗證。

5.1 先取得現場的驅動程式清單,判定列印目標

要不要改造,要看過現場裝了什麼之後再決定。用 PowerShell 的 PrintManagement 模組取得佇列與驅動程式的清單。用 Get-PrinterGet-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 類別驅動程式的佇列 DriverName 為 Microsoft IPP Class Driver Mopria 認證、網路的 IPP 啟用與可到達性、USB 的 IPP over USB 模式。不要光看名稱就斷定它與 WPP 相容
Universal Print 的佇列 使用內建的 Universal Print Class Driver8 視為 WPP 相容的一側,確認應用程式對佇列名稱的相依與輸出
其他內建驅動程式的佇列 既不是已知的類別驅動程式名稱,也不在第三方套件清單中 XPS 與傳真屬於刪除對象。不要把 Generic / Text Only 等當成一定會留下。Microsoft Print to PDF 沒有被列入刪除對象,因此要逐一佇列判定
廠商驅動程式的佇列 把 INF 檔案名稱與提供者和 pnputil 的第三方套件清單對照 屬於驅動程式被替換的候選。在 WPP 之下既有佇列會消失,因此要確認實體機能否重新註冊

Get-PrinterDriverInfPath 是驅動程式存放區內 INF 的路徑,不保證回傳公開名稱 oemN.inf。要把 pnputil /enum-drivers 回傳的公開名稱、原始 INF 名稱與提供者,和 InfPath 的檔案名稱及 Manufacturer 對照起來。pnputil /enum-drivers 只列舉第三方套件,內建套件不會出現在清單中。1917

盤點現場印表機清單的步驟用 PowerShell 取得佇列與驅動程式的清單,透過 DriverName 以及與 Manufacturer 和 pnputil 第三方套件清單的對照,分成 IPP 類別驅動程式的佇列、Universal Print 的佇列(WPP 相容)、其他內建驅動程式的佇列(XPS 與傳真會被刪除,Generic / Text Only 不能當成一定留下,Microsoft Print to PDF 沒有被列入刪除對象因此要個別判定)、廠商驅動程式的佇列(會被替換的候選),其中 IPP 類別驅動程式的佇列還要另外確認 Mopria 認證、網路連線時 IPP 是否啟用且可到達、USB 連線時是否處於 IPP over USB 模式,然後兩類佇列都要和應用程式的設定與列印程式碼所指向的佇列對照後判定IPP ClassUniversal Print Class其他內建廠商製用 Get-Printer / Get-PrinterDriver 取得清單DriverName 與提供者為IPP 類別驅動程式的佇列Universal Print 的佇列用第 4 章的表逐一判定是否留下會被替換的候選確認 Mopria、IPP 可到達性、USB與應用程式的設定和程式碼對照用判斷表分類

圖 14: 取得清單並依名稱分類為止不需要系統管理員權限,對照提供者則需要 pnputil 的系統管理員權限。

把這份清單和應用程式的設定、列印程式碼、所用 SDK 參照的佇列核對起來。依交付現場逐一記錄驅動程式、Mopria 認證、連線方式、IPP 的可到達性、USB 的運作模式,就能用第 4 章的表做判定。

如果在 WPP 之下列印目標不會留下、也無法重新註冊,那麼要先於程式碼盤點,去準備第 6 章的另一條路徑,或做出不使用 WPP 的判斷。 如果是即使不用 WPP 也可能受到 IPP 排名變更影響的機器,請接著確認 5.2 以後的內容。如果既不使用 WPP,也不受驅動程式替換的影響,那麼判斷就是維持目前路徑繼續維運。

如果要在應用程式內確認驅動程式名稱,可以用 WPF 的 System.Printing 讀取 PrintQueue.QueueDriver.Name20

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 服務的建立與維運和上一篇文章的第 7 章。

5.2 確認 1:有沒有儲存並還原驅動程式專屬的設定

最難找出來的就是列印設定的儲存。儲存方式不同,出問題的原因也不同。

儲存的內容 典型實作 驅動程式變了之後會出問題的原因
DEVMODE 的非公開部分 DocumentProperties 的結果或 GetHdevmode 的緩衝區整塊儲存,再用 SetHdevmode 還原 非公開資料只有那個驅動程式才能解讀
.NET Framework 的 PrinterSettings 整體 把列印對話方塊之後的物件做二進位序列化 內部複製過來的驅動程式非公開區域也可能一併被儲存
公開屬性的值 PaperSizePaperSourcePrinterResolutionDuplex 等以自訂格式儲存 出問題的不是非公開緩衝區,而是自訂紙張、紙匣編號等的意義改變
含私有擴充的 PrintTicket 儲存包含廠商專屬命名空間的 XML 專屬擴充相依於原本的驅動程式或機種

DEVMODE 可以在公開成員之後帶上由 dmDriverExtra 指明大小的非公開資料。Windows 驗證的只有公開部分,損毀的非公開資料可能在應用程式或列印多工緩衝處理器的處理程序中讓驅動程式當機。22

DEVMODE 的公開部分與非公開部分DEVMODE 結構在公開成員之後可以帶上由 dmDriverExtra 指明的、驅動程式自訂的非公開資料,只有公開部分會被 Windows 驗證,非公開部分只有那個驅動程式才能解讀,因此整塊儲存後一旦驅動程式變了就會失去意義DEVMODE 結構公開部分(dmSize)非公開部分(dmDriverExtra)由 Windows 驗證只有那個驅動程式能解讀驅動程式一變就失去意義

圖 15: 在整塊儲存下來的設定中,會出問題的是非公開部分。

SetHdevmode 接收了設定的 PrinterSettings,會把這塊非公開區域複製到內部。23 .NET Framework 版的 PrinterSettings 帶有 Serializable 屬性,而二進位序列化預設也包含 private 欄位,因此儲存整個物件同樣潛藏著相同的相依。2425

另一方面,.NET 版的 PrinterSettings 沒有 Serializable 屬性,把公開屬性逐一以自訂格式儲存的實作,並不會儲存原生的 DEVMODE 緩衝區或 dmDriverExtra 區域。24 這種情況下要注意的是 相依於驅動程式的值

儲存 DEVMODE 和儲存受控值的出問題方式不同把 DEVMODE 緩衝區整塊儲存的實作,以及把以 SetHdevmode 接收了非公開區域之後的 PrinterSettings 整體序列化的實作,都會連非公開部分一起帶著走,驅動程式一變就失去意義,而儲存公開屬性值的實作則因為 Custom 或廠商專屬的紙張、紙匣編號是對應廠商驅動程式清單的值,無法保證在 IPP 類別驅動程式之下意義相同,兩者都要換成只儲存意圖的設計整塊儲存 DEVMODE連非公開部分一起帶著走儲存 SetHdevmode 之後的整個物件驅動程式一變就失去意義儲存公開屬性的值帶著自訂紙張、紙匣的編號走無法保證在新驅動程式之下意義相同兩者都改成只儲存意圖

圖 16: 把 SetHdevmode 之後的物件整體儲存屬於非公開部分那一側,雖然出問題的方式不同,但兩者都是把驅動程式的狀態帶在身上。

如果 RawKind 表示的是標準的 PaperKindPaperSourceKind,那麼即使驅動程式變了意義也能保持。沒有保證的是,Custom 或廠商專屬的編號在另一個驅動程式之下仍指同一種紙張、同一個紙匣。請不要把標準值也一律當成會出問題的東西。2627

儲存下來的紙張、紙匣值中會出問題的部分RawKind 中對應 A4 等標準紙張(PaperKind)或 Upper、Lower 等標準進紙來源(PaperSourceKind)的值,即使驅動程式變了意義也能保持,而 Custom 或廠商專屬的值是對應廠商驅動程式清單的編號,無法保證 IPP 類別驅動程式會把它解讀成同一種紙張、同一個紙匣儲存下來的 RawKind標準值(PaperKind 等)Custom、廠商專屬的值驅動程式變了意義也保持無法保證被解讀成同一種紙張、同一個紙匣

圖 17: 會出問題的不是標準值,而是對應廠商驅動程式清單的自訂值。

PrintTicket 也一樣,公開關鍵字定義在 psk 命名空間中,但它可以包含裝置專屬的私有擴充。規定要求第三方的元素必須放在與該第三方明確關聯的命名空間中。如果儲存的 XML 中混有廠商的命名空間,就要把它當作驅動程式專屬設定來確認。2829

因應:只儲存「意圖」

把紙張大小、方向、雙面、份數、紙匣選擇這些意圖,以公開關鍵字放進自己的設定檔中。不要把驅動程式的內部狀態帶過去,而是在列印之前和目前的能力核對。

在 WPF 中,用 PrintQueue.GetPrintCapabilities 取得能力,把要求做成 PrintTicket 交給 MergeAndValidatePrintTicket30 這裡要注意的是,不支援的要求未必一定會出錯。驅動程式會解決衝突,通常會回傳一張把衝突項換成預設值之類的有效票證。

如果 ValidationResult.ConflictStatusConflictResolved,就把 ValidatedPrintTicket 中的雙面與紙匣和要求比較,把差異寫進記錄並通知使用者。31

只儲存意圖並在列印前與能力核對的設計設定檔中只以公開關鍵字儲存紙張、方向、雙面、份數、紙匣的意圖,在列印之前用 GetPrintCapabilities 取得目前印表機的能力,交給 MergeAndValidatePrintTicket,如果 ConflictStatus 為 NoConflict 就直接列印,如果為 ConflictResolved 就把被替換的項目和要求對照後轉入記錄與通知NoConflictConflictResolved設定檔:只有意圖(紙張、方向、雙面、份數)列印前呼叫 GetPrintCapabilitiesMergeAndValidatePrintTicketConflictStatus 為列印把與要求的差異寫進記錄並通知

圖 18: 儲存設定的意圖,並在列印時以目前的能力驗證。被替換掉的設定不要默默使用,要確認差異。

在 WinForms 中,要從 PrinterSettings.PaperSizesKind 或尺寸而不是依名稱重新挑選紙張。進紙來源的 PaperSources,如果是 UpperLower 這種唯一的標準值就可以重複使用,但多個專屬紙匣有可能被一併回傳成 PaperSourceKind.Custom。而且 PaperSource 沒有紙張尺寸。不要只憑 Kind 去指定專屬紙匣,要麼明確重新對應到目前的能力上,要麼讓使用者重新選擇。27

5.3 確認 2:有沒有相依於印表機名稱、佇列名稱

上一篇文章建議把印表機名稱放進設定檔。這裡要補充的前提是,在驅動程式被替換或重新偵測之後,並不保證會建立同名的佇列。指向舊佇列名稱的設定,照原樣就會找不到列印目標。

要確認的位置有三處:設定檔、程式碼中寫死的名稱,以及 SDK 與報表函式庫的內部。即使自己的程式碼裡沒有固定名稱,廠商 SDK 也可能在內部呼叫特定的佇列或驅動程式。請把 SDK 的文件和 5.1 的清單對照起來。

佇列名稱相依藏身的三個位置對佇列名稱的相依藏在設定檔中的固定名稱、程式碼中寫死的固定名稱、以及廠商 SDK 或報表函式庫內部呼叫的佇列和驅動程式這三處,前兩者可以透過搜尋程式碼與設定找到,後者要用 SDK 的文件和 5.1 的清單確認對佇列名稱的相依設定檔中的固定名稱程式碼中寫死的固定名稱SDK、函式庫內部的固定搜尋程式碼與設定找出來用 SDK 的文件和 5.1 的清單確認

圖 19: 即使自己的程式碼裡沒有佇列名稱,SDK 或函式庫的內部也可能還留著相依。

因應方式是,在啟動時確認設定的名稱是否存在於 PrinterSettings.InstalledPrinters 中,找不到就留下記錄並通知使用者。同時也要讓使用者能從設定畫面重新選擇列印目標。

絕對不要默默退回預設印表機。 因為這會把單據從別的部門的印表機印出來這種問題,掩蓋成一次正常的列印。

啟動時對印表機名稱的驗證啟動時確認設定檔中的印表機名稱是否存在於 InstalledPrinters 中,存在就列印,不存在就留下記錄並通知使用者讓其重新選擇,不要默默退回預設印表機不在絕對不能這樣做啟動時:設定中的印表機名稱是否在 InstalledPrinters 中列印到該佇列留下記錄並通知使用者在設定畫面重新選擇默默退回預設印表機

圖 20: 找不到時默默換一台印表機輸出的實作,會製造出最晚被發現的問題。

5.4 確認 3:有沒有把虛擬印表機用於產生檔案

列印到第三方 PDF 印表機再監看輸出資料夾的報表封存,或以 XPS Document Writer 產生中繼檔案的處理,一旦所用的佇列在 WPP 之下被刪除就會失效。

不過,被刪除的是 WPP 不支援的 軟體印表機。請不要把連接埠監視器 DLL 型等不支援的產品,和 OneNote 這類已更新為支援 WPP 的產品混為一談。請在第 7 章的步驟 3 中確認實際使用的佇列是否屬於刪除對象。2

如果需要的是 PDF,那麼正如上一篇文章第 5 章所說,轉向以 PDF 函式庫直接產生的架構,才是比較不受列印堆疊變化影響的設計。

5.5 確認 4:RAW 傳送是否經過了在 WPP 之下會消失的佇列

RAW 傳送是指依 OpenPrinterStartDocPrinter(資料類型「RAW」)→ WritePrinterEndDocPrinter 的順序,把印表機語言的資料經由列印多工緩衝處理器送出去的方式。文件端必須以硬體的語言完整描述列印設定,DEVMODE 的設定不會被使用。3233

它在標籤與收據上是常見做法,但 RAW 傳送並不是「不經過列印多工緩衝處理器的直接通訊」。即使實際上只是把驅動程式當成通往連接埠的通道,一旦該佇列在 WPP 之下消失,通道也就沒有了。

RAW 傳送的路徑以及在 WPP 之下會消失的環節應用程式以 OpenPrinter、StartDocPrinter、WritePrinter 把印表機語言的資料送往列印多工緩衝處理器,在 WPP 之下不會保留的佇列(例如廠商驅動程式的佇列)充當通道,資料經連接埠到達印表機,因此一旦該佇列在 WPP 之下消失,通道也就沒有了佇列消失應用程式:StartDocPrinter(RAW)、WritePrinter列印多工緩衝處理器在 WPP 之下不會保留的佇列(通道)連接埠標籤、收據印表機啟用 WPP

圖 21: RAW 傳送只是把驅動程式當成通道使用,但通道本身會消失。

要確認的是資料被送往哪一組佇列、驅動程式與連接埠的組合。不只是廠商驅動程式的佇列,Generic / Text Only 等給實體印表機使用的、IPP 類別驅動程式以外的內建驅動程式,也不能當成一定會留下。用第 7 章的刪除清單確認會消失的那些,同樣需要另一條路徑。13

另外,Microsoft Learn 中並沒有寫明可以把專屬 PDL 以 RAW 方式送往 IPP 類別驅動程式的佇列。這取決於印表機端的 IPP 實作所接受的 PDL,所以請不要判斷成「換成 IPP 之後同樣的 RAW 資料也能通過」。

6. 標籤印表機與收據印表機的退路

小村軟體建議,為標籤與收據至少準備一條不相依於列印多工緩衝處理器的輸出路徑

即使符合第 2 章的簽章例外,也不保證廠商驅動程式會繼續提供、能在 WPP 之下使用。1 在 Microsoft 的疑難排解中也有這樣的案例:2021 年的更新之後,USB 連線的收據、標籤印表機無法列印,最後靠 Known Issue Rollback 才解決。34 把輸出路徑分開掌握就是一種準備。

路徑 是否相依於列印多工緩衝處理器 適合的情境與注意事項
與裝置直接以 TCP/USB/序列埠通訊的廠商 SDK 不相依 適合廠商會長期維護 SDK 的機種。要追蹤 SDK 的位元數、相依執行階段、簽章的更新
內部呼叫 Windows 佇列與驅動程式的廠商 SDK 相依 即使當成既有資產保留,內部的佇列一旦在 WPP 之下消失也會停下來。它無法成為獨立於列印多工緩衝處理器的退路
以 TCP 通訊端直接送出印表機語言 不相依 適合網路連線的標籤印表機。要設計斷線、重送、逾時
以序列埠(虛擬 COM)/USB 直接送出 不相依 適合收據印表機,或與量測裝置並置的機器。前提是要選好虛擬 COM、HID、WinUSB
經由 IPP 類別驅動程式列印(IPP / IPP over USB) 相依。滿足條件則與 WPP 相容 要確認 Mopria 認證、網路的 IPP 啟用與可到達性、USB 的運作模式。它不是走到列印多工緩衝處理器之外的路徑

TCP 的重連設計可以借用序列通訊應用程式的陷阱中的思路。USB 的方式選擇請參閱在 Windows 應用程式中處理 USB 裝置的方法。IPP 在有些印表機上預設為停用,需要手動啟用。4

光看「SDK」這個名字,是判斷不出它是不是獨立路徑的。 請用 SDK 的文件和 5.1 的清單,確認它是直接與裝置通訊,還是最後仍要呼叫 Windows 的佇列。

如果使用 Windows 的佇列,Universal Print 雖然位於 WPP 相容的一側,但它同樣會經過列印多工緩衝處理器。既不是 IPP 類別驅動程式也不是 Universal Print 的佇列,如果是第三方驅動程式或 XPS、傳真,就會在 WPP 之下停下來;而像 Microsoft Print to PDF 這種沒有被列入刪除對象的內建佇列,則要個別判定。「WPP 相容」和「不相依於列印多工緩衝處理器」是不同的分類。

判定輸出路徑是否相依於列印多工緩衝處理器的流程候選路徑若送往 Windows 的列印佇列,那麼 IPP 類別驅動程式的佇列中印表機已取得 Mopria 認證且網路連線時 IPP 已啟用且可到達、USB 連線時處於 IPP over USB 模式的,以及身為 Windows Ready Print 一部分的 Universal Print 的佇列,雖然相依於列印多工緩衝處理器但與 WPP 相容,未取得 Mopria 認證的機種、第三方驅動程式的佇列、以及 XPS Document Writer 與傳真這類第 4 章表中會被刪除的佇列則可能在 WPP 之下停下來,而像 Microsoft Print to PDF 這種沒有被列入刪除對象的內建佇列依 5.1 個別判定,若不送往佇列,SDK 若在內部呼叫佇列或驅動程式就回到同樣的判定,不呼叫的 SDK 與直接送往裝置的路徑則是不相依於列印多工緩衝處理器的退路是(第三方驅動程式、XPS、傳真)否(Print to PDF 等)候選的輸出路徑是否送往 Windows 的列印佇列是否為 IPP 類別驅動程式的佇列是否已取得 Mopria 認證IPP 是否可到達(USB 為 over USB)相依但與 WPP 相容相依,且可能在 WPP 之下停下來是否為 Universal Print 的佇列第 4 章的表中是否會被刪除個別判定(5.1)是否經由廠商 SDK內部是否呼叫佇列、驅動程式確認:SDK 文件與 5.1 的清單不相依的退路

圖 22: 最後取決於經過哪個佇列,除了已取得 Mopria 認證機種的 IPP 類別驅動程式佇列和 Universal Print 的佇列之外,再扣掉沒有被列入刪除對象的內建佇列,其餘都可能在 WPP 之下停下來。

7. 驗證步驟 ── 使用 WPP 的情況與不使用的情況

先確認使用 WPP 與不使用 WPP 時驗證的分歧。兩者都要保留變更前的輸出,並在實際使用的列印目標上確認。

依是否使用 WPP 區分的列印驗證步驟在驗證機上重現全部佇列並保存變更前的輸出,使用 WPP 時啟用它並記錄被刪除的佇列,比較相容機種重新註冊之後的輸出,同時確認不相容機種的另一條路徑,不使用 WPP 時則在維持停用的狀態下對實體的 IPP 排名變更對象機重新偵測並比較輸出,其餘則在實際的佇列上確認列印使用不使用重現全部佇列並記錄保存變更前的列印結果是否使用 WPP啟用並記錄被刪除的佇列相容機種視需要重新註冊用與變更前相同的列印做比較不相容機種以另一條路徑確認是否為實體的 IPP 排名變更對象維持停用狀態刪除並重新偵測在實際的佇列上確認列印記錄結果並復原驗證機

圖 23: 把變更前的輸出當成共同基準,只在使用 WPP 的環境中啟用它。不使用的環境則確認 IPP 的排名變更與在實際佇列上的列印。

7.1 共同的準備:在驗證機而非正式機上重現全部列印目標

驗證要使用 Windows 11 24H2 以後的電腦,不要在正式機上進行。如果是網路連線,可以用能連到同一台印表機的 VM 驗證。若要評估 USB 連線的重新註冊或直接通訊,除非 VM 能直通同一個 USB 介面,否則要使用實體的驗證機。

無論是否使用 WPP,都要依下面的步驟 1、2 保留變更前的狀態。

  1. 重現現場中應用程式使用的全部佇列。 不只是廠商驅動程式的實體印表機,第三方 PDF 虛擬印表機和 Generic / Text Only 等內建佇列也要以同樣的組態裝上。用 5.1 的指令碼記錄驅動程式名稱與版本。能以刪除差異判定的,只有驗證機上存在的佇列。
  2. 把列印功能全部跑一遍並保存輸出。 確認紙張、紙匣、雙面、份數的設定畫面、各報表的列印、PDF 輸出、標籤列印,做出日後可供比較的基準。
要在驗證機上重現的佇列在 5.1 的盤點中查明的應用程式所用佇列裡,廠商驅動程式的實體印表機、第三方 PDF 等虛擬印表機、Generic / Text Only 等內建驅動程式的佇列都要以與現場相同的組態在驗證機上重現,說明能用步驟 3 的刪除清單判定的只有驗證機上存在的佇列5.1 的盤點:應用程式使用的佇列實體印表機(廠商製)虛擬印表機(第三方 PDF 等)內建驅動程式(Generic / Text Only 等)在驗證機上以相同組態重現用步驟 3 的刪除清單判定是否留下驗證機上沒有的佇列不會出現在刪除差異中

圖 24: 驗證機上沒有的佇列不會出現在刪除差異中,所以要先把盤點查明的佇列全部重現出來。

7.2 使用 WPP 的環境:啟用它,把消失的列印目標也納入驗證

在步驟 1、2 之後,依下面的順序進行。

  1. 啟用 WPP,記錄會被刪除的佇列。 在設定應用程式的「印表機與掃描器」中選擇「Windows protected print mode」的「設定」,刪除對象會顯示在對話方塊中。2 以群組原則啟用時不會出現對話方塊,因此要保存套用之前的 Get-Printer 結果,套用之後重新啟動驗證機。用 IsProtectedPrintEnabled 或設定畫面確認已啟用之後再取一次清單,記錄差異。14
  2. 重新安裝被刪除的相容印表機。 以 Windows Ready Print 重新裝上,並用 5.1 的指令碼確認實體印表機的 DriverName 已經變成 Microsoft IPP Class Driver。
  3. 重複相同的列印,與變更前比較。 確認設定畫面的選項、儲存設定的還原、以及因佇列名稱改變導致的列印目標消失。輸出的邊界、字型、格線也要與步驟 2 的輸出對照。
  4. 不相容的機種以第 6 章的另一條路徑列印。 在重現出「印表機不在清單中」的狀態之後,確認仍能輸出。驗證對象不只是改過的程式碼,還包括準備好的路徑。

7.3 不使用 WPP 的環境:不啟用它,驗證驅動程式選擇的變化

在決定不使用 WPP 的環境中,不執行步驟 3、4。因為一旦啟用 WPP,佇列會整個被刪除,只由排名規則帶來的影響就看不見了。

列印目標 在步驟 1、2 之後要做的事
會成為排名變更對象的實體 IPP 相容機 在維持 WPP 停用的狀態下,在驗證機上刪除、重新偵測、重新安裝。用 5.1 的指令碼確認是否變成 IPP 類別驅動程式,並進行步驟 5 的比較
雲端、虛擬的佇列 既沒有要重新偵測的實體機器,也沒有排名變更,因此在實際使用的佇列上確認步驟 2 的輸出

7.4 驗證之後的復原,以及整理裝機程序

在本機設定應用程式中啟用了 WPP 的驗證機,可以用「關閉」改回去。若是從群組原則或 Intune 套用的,就需要系統管理員端變更原則,所以要配合啟用的途徑準備好復原程序。213

即使把 WPP 改回停用,以 Windows Ready Print 重新裝好的印表機也會維持原樣。之前不相容的印表機要手動重新安裝。210

在裝機方面,要把 WPP 原則與印表機的重新註冊程序,納入從群組原則到 Intune中整理過的派送機制。以 Point and Print 派送第三方驅動程式,自 2021 年的 KB5005652 起預設就需要系統管理員認證,34 而在 WPP 之下派送本身就不會進行。9 在使用 WPP 的環境中,要把相依於驅動程式派送的程序,換成這套原則套用與重新註冊的程序。

裝機程序的重新檢視以 Point and Print 派送第三方驅動程式的程序,因為 2021 年以後需要系統管理員認證而且在 WPP 之下派送本身就不會進行,所以要從程序中拿掉,改成把 WPP 的原則(群組原則或 OMA-URI)與印表機的重新註冊程序納入派送機制以 Point and Print 派送第三方驅動程式2021 年以後需要系統管理員認證WPP 之下派送本身不會進行從程序中拿掉納入 WPP 的原則與重新註冊程序

圖 25: 派送驅動程式的程序,被換成派送 WPP 原則與印表機重新註冊的程序。

8. 總結

需要做的因應,依 「列印目標會不會留下」→「程式碼相依於什麼」→「在什麼條件下驗證」 的順序決定。

確認結果 因應
佇列在 WPP 之下不會留下,實體印表機也無法重新註冊 準備另一條路徑,或先做出不使用 WPP 的判斷
儲存了驅動程式專屬設定 儲存意圖而非狀態,並在列印之前確認能力
相依於佇列名稱或虛擬印表機 準備好列印目標的存在確認、記錄、通知與重新選擇。PDF 以函式庫直接產生
RAW 傳送的通道在 WPP 之下會消失 準備不相依於列印多工緩衝處理器的路徑
能確保列印目標,且只做繪製、不相依於特定驅動程式 不要一律重寫,驗證實際輸出即可

改完一處不代表結束。 改完設定之後,還要接著確認佇列名稱、虛擬印表機、RAW 傳送,最後用第 7 章確認輸出。對於即使不使用 WPP 也可能遇到 IPP 排名變更的機器,需要做相依盤點,以及維持 WPP 停用狀態的重新偵測驗證。

判斷是要修改還是只需確認的決策樹先判定列印目標的佇列在 WPP 之下是否留下(Universal Print 的雲端佇列或支援 WPP 的虛擬印表機)或者實體印表機能否以 Windows Ready Print 重新註冊,如果不行就選擇準備另一條路徑或不使用 WPP,如果該機器支援 IPP 且可能因排名變更而被替換,就依驅動程式專屬設定的儲存、對佇列名稱或虛擬印表機的相依(包含 SDK 與函式庫內部)、RAW 傳送的順序確認,符合的就修改後進入下一步,最後使用 WPP 的環境進入第 7 章的 WPP 啟用驗證,不使用的環境中實體的 IPP 相容機進入維持 WPP 停用的重新偵測驗證,雲端與虛擬的佇列進入實際輸出確認,既不使用 WPP 也不受替換影響的則維持目前路徑繼續維運準備另一條路徑不使用 WPP佇列在 WPP 之下留下或可重新註冊嗎該怎麼做支援 IPP 且可能被替換嗎支援 IPP 且可能被替換嗎是否儲存了驅動程式專屬設定只做驗證(第 7 章)維持目前路徑繼續維運修改(5.2)是否相依於佇列名稱、虛擬印表機也包含 SDK、函式庫內部的相依修改(5.3、5.4)是否把 RAW 傳送送往 WPP 之下不會留下的佇列準備通道(第 6 章)是否使用 WPP是否為實體的 IPP 相容機不啟用 WPP 的重新偵測驗證(7.3)在實際的佇列上確認輸出

圖 26: 先判定佇列在 WPP 之下會不會留下,程式碼的相依改完一處也要繼續下一項確認,改過的路徑最後同樣要驗證。不使用 WPP 時,不做第 7 章的 WPP 啟用,而是讓實體的 IPP 相容機做維持 WPP 停用的重新偵測,讓雲端、虛擬的佇列做實際輸出確認。

準備的期限,要放在自家的部署計畫上而不是 Microsoft 的日期上

據說 WPP 未來會預設啟用,但沒有給出時程。10 準備的期限要放在自家啟用 WPP 之前,或者把 Windows 11 24H2 以後的功能更新推向現場之前。2027 年 7 月 1 日是驅動程式供給端的節點,並不是業務應用程式端的截止日。1

業務應用程式端準備期限的設定方式現在就做清單取得與盤點,把路徑的更換與驗證放在自家啟用 WPP 之前或推送 24H2 以後功能更新之前這個自家端的期限內完成,2027 年 7 月 1 日的驅動程式停止更新是供給端的節點而不是準備的期限,要先把環境做成時程未定的 WPP 預設啟用無論何時到來都不受影響的狀態是供給端的節點而不是期限現在:取得清單與盤點路徑更換與驗證期限:自家啟用 WPP 之前 / 功能更新推送之前WPP 預設啟用(時程未定)到來時也不受影響2027 年 7 月 1 日:驅動程式停止更新

圖 27: 期限放在自家的部署計畫上,不要把 Microsoft 的節點日期當成截止日。

首先從取得交付現場的清單、掌握設定、列印目標、輸出路徑的相依開始。PDF 直接產生,標籤與收據則持有一條獨立於列印堆疊的路徑。在此基礎上,再依實際的部署條件確認列印。

停留在 Windows 10 的環境不在這個計畫的對象範圍內,但一般通道的 Windows 10(22H2)支援已在 2025 年 10 月結束。Enterprise LTSC、IoT Enterprise LTSC 的期限依版本而異,需要確認生命週期。包含 ESU 與 LTSC 的判斷請參閱Windows 10支援結束後的現實解方,工業用電腦請參閱工業用電腦該安裝哪一種Windows。在移轉目標的 Windows 11 上重做一次第 7 章的驗證,才算把列印的準備做完。

相關文章

相關的諮詢領域

小村軟體有限公司承接的工作包括:盤點具備報表、標籤列印的業務應用程式對列印驅動程式的相依、重新檢視列印路徑(PDF 直接產生、標籤印表機的直接控制),以及設計以 Windows protected print mode 為前提的驗證計畫。

參考連結

  1. Microsoft Learn, End of servicing plan for third-party printer drivers on Windows. 關於 2025 年 5 月更新的時程(2026 年 1 月 15 日、2026 年 7 月 1 日、2027 年 7 月 1 日)、對象為 Windows 11 以後與 Windows Server 2025 以後、既有驅動程式仍可安裝且沒有停用 v3/v4 功能的計畫、簽章例外的 3 個條件(無法取得 Mopria 認證、上限為 Windows 10 以下、原生 ARM64)、USB 機器只有在 IPP over USB 模式下才能使用各項功能,以及 Windows 10 21H2 以後內建 Microsoft IPP Class Driver。  2 3 4 5 6 7 8 9 10

  2. Microsoft Learn, Overview of Windows protected print mode. 關於啟用時使用第三方驅動程式的印表機會被解除安裝並從驅動程式存放區刪除、即使已取得 Mopria 認證但以第三方驅動程式導入的印表機也需要重新安裝、不受支援的軟體印表機(如 OneNote (Desktop))與 XPS、傳真會被刪除、透過群組原則啟用時使用者無法解除,以及在設定應用程式中啟用與停用的步驟。  2 3 4 5 6 7 8

  3. Microsoft Learn, Step 2: A Driver Package for the Device is Selected. 關於多個驅動程式套件相符時,Windows 會為每個套件評定排名並安裝排名最好的那一個,排名相同則依日期與版本選擇。 

  4. Microsoft Learn, IPP printers with the Universal Print Connector. 關於 Microsoft IPP Class Driver 是與已取得 Mopria 認證的印表機以 IPP 通訊的內建驅動程式,以及有些印表機的 IPP 預設為停用需要手動啟用。  2

  5. Microsoft Learn, Legacy printer driver submission process. 關於 2026 年 1 月 15 日之後,無論 WHQL 或 Attestation,列印驅動程式的提交都會被預設封鎖,需附上正當性說明文件進行人工審查。 

  6. Microsoft Learn, Windows Print Path Overview. 關於 Windows 中存在 GDI 列印路徑與 XPS 列印路徑這兩條主要的列印路徑。 

  7. Microsoft Learn, Discover Windows Ready Print. 關於 Windows Ready Print 是包含 IPP、eSCL、Universal Print 的稱呼,不需要第三方驅動程式,為已取得 Mopria 認證的印表機而設計,而且不相依於電腦的架構。 

  8. Microsoft Learn, Universal Print troubleshooting - Understanding the stages of a print job. 關於 Universal Print 的印表機使用內建的 Universal Print class driver,列印多工緩衝處理器以 IPP over HTTPS 把工作送往服務。  2 3

  9. Microsoft Learn, More information on Windows protected print mode for enterprises and developers. 關於列印問題占過去三年 MSRC 通報的 9%、列印多工緩衝處理器以 SYSTEM 運轉並載入第三方程式碼、舊驅動程式與 CFG/CET/ACG 不相容、IPP 以 HTTP POST 為基礎並以 URI 識別且在用戶端算繪 PWG Raster 與 PDF 等少數 PDL、WPP 之下的模組載入限制與使用者權限的 XPS 算繪、受限權杖、禁止建立子處理程序與二進位緩解措施,以及 Point and Print 不再安裝第三方驅動程式。  2 3 4 5 6

  10. Microsoft Learn, Windows protected print mode FAQ. 關於不相容的印表機在啟用期間無法重新安裝、停用之後要手動裝回、專屬功能透過 Print Support App 提供,以及 Windows protected print mode 未來的某個時間點會預設啟用。  2 3 4

  11. Microsoft Learn, Printer driver isolation. 關於隔離模式(Shared / Isolated / None)的意義、沒有在 INF 中宣告 DriverIsolation 關鍵字的驅動程式預設在列印多工緩衝處理器的處理程序內執行,以及系統管理員可以透過列印管理主控台或多工緩衝處理器函式覆寫各驅動程式的設定。  2

  12. Microsoft Learn, What’s new in Windows 11, version 24H2. 關於 Windows protected print mode 在 24H2 中加入,並可透過設定應用程式或群組原則啟用。 

  13. Microsoft Learn, Policy CSP - Printers: ConfigureWindowsProtectedPrint. 關於適用的作業系統為 Windows 11 24H2 以後、預設為停用且對驅動程式與列印功能沒有限制,以及 ADMX 對應的登錄機碼 Software\Policies\Microsoft\Windows NT\Printers\WPP 與值 WindowsProtectedPrintGroupPolicyState。  2 3 4 5

  14. Microsoft Learn, Windows protected print mode for enterprises. 關於以群組原則「Configure Windows protected print」啟用的步驟、Intune 的 OMA-URI,以及從啟用了 WPP 的用戶端無法以列印管理去管理未啟用 WPP 的伺服器。  2 3

  15. Microsoft Learn, WindowsProtectedPrintInfo.IsProtectedPrintEnabled Property. 關於在 Windows 11 24H2 中導入的、回傳目前裝置上 WPP 是否啟用的靜態屬性。 

  16. Microsoft Learn, Get-PrinterDriver. 關於它回傳指定電腦的列印驅動程式清單,而且不需要系統管理員認證。 

  17. Microsoft Learn, PnPUtil Command Syntax. 關於 /enum-drivers 列舉第三方的驅動程式套件,Windows 11 21H2 以後可以用 /class 依類別名稱篩選,以及需要以系統管理員身分開啟命令提示字元執行。  2

  18. Microsoft Learn, How to display printer status in a UWP device app. 關於以 get-printer | Select Name, {(get-printerdriver -Name $_.DriverName).MajorVersion} 分辨 v3 或 v4 的做法。 

  19. Microsoft Learn, PnPUtil. 關於列舉驅動程式存放區中的套件時不包含內建(in-box)的套件,只列舉內建以外的套件。 

  20. Microsoft Learn, PrintQueue.QueueDriver Property. 關於可以把佇列所用的列印驅動程式取得為 PrintDriver。 

  21. Microsoft Learn, PrintServer Class. 關於 System.Printing 命名空間的類別不支援在 Windows 服務或 ASP.NET 應用程式中使用,可能造成效能下降或執行階段例外。 

  22. Microsoft Learn, DEVMODEW structure (wingdi.h). 關於可以在公開成員之後緊接著放置驅動程式定義的非公開成員、其大小由 dmDriverExtra 指明、Windows 只驗證公開部分,以及非公開部分損毀的資料可能讓驅動程式當機。 

  23. dotnet/winforms(GitHub), PrinterSettings.cs. 關於 SetHdevmode 會把 dmDriverExtra 那部分非公開區域複製到內部、GetHdevmode 再把它寫回,以及其他路徑不會持有非公開區域。 

  24. Microsoft Learn, PrinterSettings Class. 關於 .NET Framework 版的宣告帶有 Serializable 屬性而 .NET 版沒有,以及 GetHdevmodeSetHdevmode 是與 DEVMODE 的相互轉換。  2

  25. Microsoft Learn, SerializableAttribute Class. 關於帶有 Serializable 屬性的型別預設會序列化 private 與 public 的所有欄位,要排除則需加上 NonSerialized 屬性。 

  26. Microsoft Learn, PaperSize.RawKind Property. 關於 RawKind 是表示標準紙張種類的值或自訂值的整數。 

  27. Microsoft Learn, PaperSourceKind Enum. 關於除了 UpperLower 等標準進紙來源種類之外,還定義了表示印表機專屬進紙來源的 Custom。  2

  28. Microsoft Learn, Print Schema. 關於 Print Schema 允許第三方擴充,私有的 Property 元素必須屬於與該第三方明確關聯的命名空間。 

  29. Microsoft Learn, Print Schema-Related Technologies. 關於 PrintTicket 是 DEVMODE 的後繼,裝置專屬的 PrintTicket 可以包含針對特定機種的私有擴充。 

  30. Microsoft Learn, How to: Validate and Merge PrintTickets. 關於以 PrintQueue.GetPrintCapabilities 確認印表機支援的功能,並以 MergeAndValidatePrintTicket 把要求內容合併、驗證成印表機專屬的有效 PrintTicket 的步驟。 

  31. Microsoft Learn, ConflictStatus Enum. 關於 MergeAndValidatePrintTicket 會讓驅動程式替換不支援的設定並回傳有效的票證,並以 ValidationResult.ConflictStatusConflictResolved 回報發生過替換。 

  32. Microsoft Learn, WritePrinter function. 關於從 StartDocPrinterEndDocPrinter 的步驟、資料類型為「RAW」時文件必須以硬體的語言完整描述相當於 DEVMODE 的設定,以及 WritePrinter 是封鎖式函式從 UI 執行緒呼叫時可能看起來沒有回應。 

  33. Microsoft Learn, RAW data type. 關於 RAW 資料不經進一步處理就送往列印監視器,由 PCL 命令構成的檔案就是一例。 

  34. Microsoft Learn, Printing issue troubleshooting guidance. 關於 KB5005652 之後 Point and Print 的預設行為變更使其開始要求系統管理員認證,以及 2021 年套用更新程式後 USB 連線的收據、標籤印表機無法列印並靠 Known Issue Rollback 解決的案例。  2

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

常見問題

整理諮詢這個主題時常見的問題。

現在正在運作的印表機與應用程式,過了 2026 年 7 月或 2027 年 7 月就會突然無法列印嗎?
不會。Microsoft 的計畫是「不把新的第三方驅動程式放上 Windows Update」「在排名上優先選用 IPP 類別驅動程式」「不再受理更新」這種供給端的分階段收尾,文件明確寫明它不會停用既有的驅動程式。既有驅動程式仍可從廠商提供的安裝程式安裝。危險的是兩個情境:在 IPP 類別驅動程式也相符的機器上,更換電腦或重新安裝作業系統時驅動程式被自動換成 IPP 類別驅動程式;以及啟用了 Windows protected print mode 的情境。
Windows protected print mode 會預設啟用嗎?
在本文撰寫時(2026 年 9 月)預設為停用,要在設定應用程式、群組原則或 Intune 中啟用。不過 Microsoft 的 FAQ 明確表示「未來的某個時間點會預設啟用」。由於沒有給出時程,先把環境做成即使被啟用也不會為難的狀態,才是應有的準備。
標籤印表機與收據印表機會變成怎樣?
對於無法取得 Mopria 認證的印表機,文件把它列入 2026 年 1 月 15 日之後仍可例外取得驅動程式簽章的條件之中。也就是說廠商驅動程式確實有可能暫時保留,但在啟用了 Windows protected print mode 的環境中,使用第三方驅動程式的印表機會被解除安裝,所以照原樣是用不了的。如果持有與裝置直接以 TCP/USB/序列埠通訊的廠商 SDK,或是直接送出印表機語言來控制的路徑,就能與列印多工緩衝處理器的變化脫鉤。內部呼叫 Windows 佇列或驅動程式的 SDK,在第三方驅動程式消失後同樣會停下來,因此不能當成退路。
應用程式的列印程式碼維持 PrintDocument 就可以嗎?
GDI 列印路徑與 XPS 列印路徑都會保留,Microsoft 也明確表示沒有停用 v3/v4 驅動程式功能的計畫。只用 PrintDocument 或 FixedDocument 繪製的應用程式,不是要修改的對象,而是要確認的對象。要修改的是:儲存並還原驅動程式專屬設定(DEVMODE 的非公開部分或 PrintTicket 的私有命名空間)的程式碼;相依於特定佇列名稱或虛擬印表機名稱的程式碼(包含廠商 SDK 與報表函式庫內部呼叫的部分);以及把 RAW 資料經由列印多工緩衝處理器送往在 WPP 之下不會保留的佇列(例如廠商驅動程式的佇列)的程式碼。不過,如果列印目標的印表機本身是無法以 Windows Ready Print 重新註冊的機種,那麼即使程式碼只做繪製,在 Windows protected print mode 之下佇列也會整個消失,所以要先準備另一條路徑。
該從哪裡著手?
從取得交付現場的印表機與驅動程式清單開始。用 PowerShell 的 Get-Printer 與 Get-PrinterDriver,不需要系統管理員權限就能查出哪個佇列在用哪個驅動程式(是 v3 還是 v4,是不是 IPP 類別驅動程式)。接著把該清單與應用程式做名稱指定、設定儲存、RAW 傳送的佇列對照起來,用本文的判斷表分成「維持原樣」「驗證」「更換路徑」三類。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽