Windows 从 2022 年开始推行保护打印模式(Windows Protected Print Mode),旨在解决臭名昭著的 PrintNightmare 漏洞。但代价是——大量旧款打印机和第三方驱动无法使用。
如果你遇到打印机装不上、驱动报错、打印服务崩溃等问题,很可能就是保护打印模式在"保护"你,让你没法打印。
一、什么是保护打印模式?
保护打印模式是微软为修复 PrintNightmare(CVE-2021-34527) 漏洞引入的安全机制。
PrintNightmare 是什么?
- 一个存在于 Windows Print Spooler 服务中的远程代码执行漏洞
- 攻击者可以通过打印机驱动以 SYSTEM 权限在目标机器上执行任意代码
- 被广泛用于勒索软件攻击和横向渗透
微软的修复方案:
| 阶段 | 措施 |
|---|---|
| 第一阶段(2021) | 禁用非管理员安装驱动的权限 |
| 第二阶段(2022) | 引入保护打印模式,默认开启 |
| 第三阶段(2023+) | 新安装的 Windows 强制使用 IPP 通用驱动 |
保护打印模式做了什么
- 只允许使用 Microsoft IPP Class Driver(通用打印机驱动)
- 禁止加载第三方打印机驱动(尤其是通过 Print Spooler 的
AddPrinterDriver接口) - 限制打印队列的访问权限
初衷是好的,但实际影响:
- 你 2015 年买的 HP/Canon/Brother 打印机,官方驱动用不了
- 企业里特有的票据打印机、条码打印机、标签打印机全部失效
- 只能用 Windows 自带的通用驱动,功能受限(缺双面打印、缺色彩管理、缺纸张自定义)
二、判断保护打印模式是否开启
方法一:注册表检查
# 以管理员身份运行 PowerShell
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" -Name "RelaunchElevatedPrintDriverPrompt" -ErrorAction SilentlyContinue如果返回 RelaunchElevatedPrintDriverPrompt = 0,说明保护打印模式启用中。
方法二:查看打印机属性
- 打开 设置 → 蓝牙和设备 → 打印机和扫描仪
- 点击已安装的打印机 → 打印机属性
- 在 端口 标签中,查看端口类型
- 如果显示为 WSD 端口 或 IPP:// 开头,说明正在使用保护打印模式
方法三:查看 Print Spooler 日志
# 查看最近的打印事件
Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational" -MaxEvents 10 |
Where-Object { $_.LevelDisplayName -eq "Error" } |
Format-Table TimeCreated, Message -Wrap如果错误中包含 "拒绝访问"、"驱动加载失败"、"0x000006ba" 等代码,很可能和保护打印模式有关。
三、关闭保护打印模式
方法一:组策略(适用于专业版/企业版)
# 以管理员身份运行
gpedit.msc导航到:
计算机配置 → 管理模板 → 打印机找到以下策略并禁用:
| 策略名称 | 操作 |
|---|---|
| "限制非管理员安装打印机驱动程序" | 设置为 已禁用 |
| "配置受保护的打印" | 设置为 已禁用 |
| "执行 Windows 保护打印模式" | 设置为 已禁用 |
然后重启 Print Spooler 服务:
Restart-Service Spooler方法二:注册表修改(通用,所有版本)
# 以管理员身份运行 PowerShell
# 1. 关闭保护打印模式
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" -Force | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" `
-Name "RelaunchElevatedPrintDriverPrompt" -Value 1 -Type DWord
# 2. 关闭驱动签名强制检查(可选,仅对旧驱动需要)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" `
-Name "CopyFilesPolicy" -Value 1 -Type DWord
# 3. 允许非管理员安装驱动
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" `
-Name "RestrictDriverInstallationToAdministrators" -Value 0 -Type DWord
# 4. 重启打印服务
Restart-Service Spooler
RelaunchElevatedPrintDriverPrompt = 1表示关闭保护打印模式,= 0表示启用。
方法三:直接修改注册表文件
如果 PowerShell 也无法修改注册表(某些系统策略限制),可以用注册表编辑器:
- 按
Win + R,输入regedit - 导航到:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers - 如果不存在,右键
Printers→ 新建 → 项 - 创建以下 DWORD 值(32位):
| 值名称 | 数值数据 | 说明 |
|---|---|---|
RelaunchElevatedPrintDriverPrompt |
1 |
关闭保护打印模式 |
RestrictDriverInstallationToAdministrators |
0 |
允许非管理员装驱动 |
CopyFilesPolicy |
1 |
允许旧驱动文件复制 |
- 关闭注册表,重启 Print Spooler 服务
四、关闭后重装打印机驱动
关闭保护打印模式后,需要重新安装打印机原本的驱动。
步骤
# 1. 彻底删除旧的打印机和驱动
# 在 PowerShell 中(管理员):
$printer = Get-Printer -Name "你的打印机名称" -ErrorAction SilentlyContinue
if ($printer) {
Remove-Printer -Name $printer.Name
}
$driver = Get-PrinterDriver -Name "你的驱动名称" -ErrorAction SilentlyContinue
if ($driver) {
Remove-PrinterDriver -Name $driver.Name
}
# 2. 重启打印服务
Restart-Service Spooler
# 3. 手动安装官方驱动
# 运行厂商提供的安装程序(exe 或 msi)如果还是装不上
卸载通用驱动后再安装:
设置 → 打印机和扫描仪 → 选择打印机 → 删除设备然后从厂商官网下载最新驱动进行安装。如果仍然报错 0x000006ba,尝试:
- 在 服务管理器 中找到 Print Spooler
- 停止服务
- 删除
C:\Windows\System32\spool\PRINTERS\下的所有文件 - 重启服务
五、安全权衡
关闭保护打印模式意味着重新暴露 PrintNightmare 的攻击面。请评估你的场景:
| 建议 | 场景 |
|---|---|
| 关闭保护模式 | 办公室内有大量旧打印机、专用打印设备 |
| 保持开启 | 仅使用现代打印机,驱动完全兼容 IPP |
| 临时关闭 | 安装完旧驱动后重新开启 |
安全补充措施
如果必须关闭保护打印模式,建议配合以下措施:
# 1. 确保 Print Spooler 不暴露在网络中
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Print" `
-Name "RpcAuthnLevelPrivacyEnabled" -Value 1 -Type DWord
# 2. 禁用从远程计算机访问打印机
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Print" `
-Name "DisableWebPnPDownload" -Value 1 -Type DWord
# 3. 防火墙限制 135/445 端口(如果不需要网络打印)
# 使用 Windows 防火墙高级安全策略限制入站 RPC 连接六、确认关闭成功
# 验证保护打印模式已关闭
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" |
Select-Object RelaunchElevatedPrintDriverPrompt
# 如果返回 1,说明已关闭
# 测试打印
echo "测试打印页面" | Out-Printer -Name "你的打印机名称"七、另一种选择:使用 IPP Everywhere
如果你的打印机支持 IPP Everywhere 标准,其实不需要关闭保护打印模式。
查看打印机是否支持 IPP:
# 检查打印机驱动是否为 IPP 类驱动
Get-PrinterDriver | Where-Object { $_.Name -like "*IPP*" }支持 IPP 的打印机品牌:
| 品牌 | 支持情况 |
|---|---|
| HP 大部分机型 | ✅ 支持 |
| Brother 新款 | ✅ 支持 |
| Canon 新款 | ✅ 支持 |
| Epson 新款 | ✅ 支持 |
| 2018 年前的老旧型号 | ❌ 不支持 |
如果你的打印机不在支持列表内,或者 IPP 通用驱动缺少你需要的功能(如双面打印、无边距、色彩配置),关闭保护打印模式是唯一的解决方案。
八、总结
| 步骤 | 操作 |
|---|---|
| 判断 | 检查注册表 RelaunchElevatedPrintDriverPrompt 是否为 0 |
| 关闭 | 组策略禁用三项策略 / 注册表设为 1 / 重启 Spooler |
| 重装驱动 | 删除旧驱动 → 重启服务 → 安装厂商驱动 |
| 验证 | 打印测试页,确认功能正常 |
| 安全 | 关闭后补强 RPC 策略和防火墙规则 |
关闭保护打印模式不是微软推荐的做法,但当你的打印机因为安全策略变成"废铁"时,这是唯一的实际解决办法。