关闭 Windows 保护打印模式

2025-12-17 Windows

Windows 从 2022 年开始推行保护打印模式(Windows Protected Print Mode),旨在解决臭名昭著的 PrintNightmare 漏洞。但代价是——大量旧款打印机和第三方驱动无法使用。

如果你遇到打印机装不上、驱动报错、打印服务崩溃等问题,很可能就是保护打印模式在"保护"你,让你没法打印。

一、什么是保护打印模式?

保护打印模式是微软为修复 PrintNightmare(CVE-2021-34527) 漏洞引入的安全机制。

PrintNightmare 是什么?

  • 一个存在于 Windows Print Spooler 服务中的远程代码执行漏洞
  • 攻击者可以通过打印机驱动以 SYSTEM 权限在目标机器上执行任意代码
  • 被广泛用于勒索软件攻击和横向渗透

微软的修复方案:

阶段 措施
第一阶段(2021) 禁用非管理员安装驱动的权限
第二阶段(2022) 引入保护打印模式,默认开启
第三阶段(2023+) 新安装的 Windows 强制使用 IPP 通用驱动

保护打印模式做了什么

  1. 只允许使用 Microsoft IPP Class Driver(通用打印机驱动)
  2. 禁止加载第三方打印机驱动(尤其是通过 Print Spooler 的 AddPrinterDriver 接口)
  3. 限制打印队列的访问权限

初衷是好的,但实际影响:

  • 你 2015 年买的 HP/Canon/Brother 打印机,官方驱动用不了
  • 企业里特有的票据打印机、条码打印机、标签打印机全部失效
  • 只能用 Windows 自带的通用驱动,功能受限(缺双面打印、缺色彩管理、缺纸张自定义)

二、判断保护打印模式是否开启

方法一:注册表检查

# 以管理员身份运行 PowerShell
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Printers" -Name "RelaunchElevatedPrintDriverPrompt" -ErrorAction SilentlyContinue

如果返回 RelaunchElevatedPrintDriverPrompt = 0,说明保护打印模式启用中。

方法二:查看打印机属性

  1. 打开 设置 → 蓝牙和设备 → 打印机和扫描仪
  2. 点击已安装的打印机 → 打印机属性
  3. 在 端口 标签中,查看端口类型
  4. 如果显示为 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 也无法修改注册表(某些系统策略限制),可以用注册表编辑器:

  1. 按 Win + R,输入 regedit
  2. 导航到:
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers
  3. 如果不存在,右键 Printers → 新建 → 项
  4. 创建以下 DWORD 值(32位):
值名称 数值数据 说明
RelaunchElevatedPrintDriverPrompt 1 关闭保护打印模式
RestrictDriverInstallationToAdministrators 0 允许非管理员装驱动
CopyFilesPolicy 1 允许旧驱动文件复制
  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,尝试:

  1. 在 服务管理器 中找到 Print Spooler
  2. 停止服务
  3. 删除 C:\Windows\System32\spool\PRINTERS\ 下的所有文件
  4. 重启服务

五、安全权衡

关闭保护打印模式意味着重新暴露 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 策略和防火墙规则

关闭保护打印模式不是微软推荐的做法,但当你的打印机因为安全策略变成"废铁"时,这是唯一的实际解决办法。