Windows 共享打印机报错 0x0000011b:别再重装驱动了,三步解决
共享打印机突然连不上,报 0x0000011b。九成的人第一反应是重装驱动、改共享权限、重启电脑 —— 全是白费。这个问题跟驱动和权限都没关系,三分钟能判断清楚。
一、30 秒判断:这是不是你的问题
- 报错原文是 「无法连接到打印机。操作无法完成(错误 0x0000011b)」,而且出现在添加 / 连接打印机的过程中,不是点打印的时候。
- 打印机是通过
\\服务器名\打印机名这种方式装的(走 SMB 共享),不是 IP 端口直连。 - 客户端是 Win10(装过 2021 年 9 月之后的累积更新)或 Win11,服务端则多半是 Win7 / Server 2008 R2 / 早期 Win10 / 群晖之类的 NAS。
如果是「打印任务发出去没反应」「打印乱码」,或者报的是 0x00000709 / 0x80070005 / 0x00000bbb,那不是这个问题,看文末的相关报错。
二、适用环境
| 项目 | 说明 |
|---|---|
| 客户端 | Windows 10 1809 及以上、Windows 11 全版本 |
| 服务端 | Windows 7 SP1 / Server 2008 R2 / Server 2012 R2 / 早期 Win10;部分群晖、威联通等 NAS 的打印服务 |
| 触发条件 | 客户端装了 2021 年 9 月及之后的累积更新(如 KB5005565 这一批) |
| 网络环境 | 域环境和工作组都可能出现,跟网络通不通无关 |
| 不适用 | 报错发生在发送打印任务阶段;或本来就用 IP 直连端口 |
三、为什么会这样
2021 年微软修 PrintNightmare(CVE-2021-1678)时,把打印客户端的 RPC 认证级别默认提到了「数据包隐私」(RPC_C_AUTHN_LEVEL_PKT_PRIVACY)。客户端要求加密握手,而老服务端的打印共享不支持这个级别 —— 于是连接在认证阶段就被拒掉了,报 0x0000011b。
一句话:不是驱动问题,不是权限问题,不是网络问题,是两边的认证级别谈不拢。
所以重装驱动、重设共享权限、换交换机、重装系统,全都没用 —— 这是很多人查两天的原因。
四、方案 A:改成 IP 直连(推荐,根治)
不去修那条 SMB 共享连接,而是让客户端直接连打印机自己的 IP。这一条路完全绕开 RPC 认证,而且附带三个好处:不受服务端补丁影响、少一跳所以更快、服务端关机也不影响打印。
前提
- 打印机有网口(或已接 WiFi),能拿到自己的 IP
- 客户端能通到它的 9100 端口(RAW 打印);少数机型用 LPR 515 或 IPP 631
- 打印机 IP 建议在 DHCP 里做保留,否则换了 IP 又要重配
步骤(命令行,一条到位)
# 1. 先确认能不能通(能通会返回 TcpTestSucceeded : True)
Test-NetConnection -ComputerName 10.0.1.20 -Port 9100
# 2. 建 TCP/IP 端口
Add-PrinterPort -Name "IP_10.0.1.20" -PrinterHostAddress "10.0.1.20"
# 3. 查一下本机有哪些驱动可用(名称要一字不差地抄)
Get-PrinterDriver | Select-Object -ExpandProperty Name
# 4. 建打印机
Add-Printer -Name "3F-HP-M403" -DriverName "HP LaserJet Pro M403-M404 PCL 6" -PortName "IP_10.0.1.20"
不想用命令行也行:控制面板 → 设备和打印机 → 添加打印机 → 「我需要的打印机不在列表中」→ 通过 IP 地址添加 → 填 IP,驱动选同型号。
什么时候 A 走不通:打印机本身没有网口(只有 USB,靠某台电脑共享出来)。这种情况只能用方案 B。
五、方案 B:放宽本机认证级别(临时救急)
改一个注册表值,让本机接受较低级别的认证。有效,但等于把微软那层加固部分回退了,只在可信内网、且方案 A 不可行时用。
GUI 做法
regedit → 定位到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print → 新建 DWORD(32 位)值,名称 RpcAuthnLevelPrivacyEnabled,值 0 → 重启 Print Spooler 服务。
命令行做法
# 写入(需要管理员权限的 PowerShell)
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Print' `
-Name 'RpcAuthnLevelPrivacyEnabled' -PropertyType DWord -Value 0 -Force
# 重启打印后台处理程序(必须,不重启不生效)
Restart-Service Spooler -Force
# 回滚:删掉这个值即恢复系统默认
Remove-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Print' `
-Name 'RpcAuthnLevelPrivacyEnabled'
Restart-Service Spooler -Force
这个键对本机生效:改在客户端只影响那一台,改在服务端则全公司生效(同时也等于全公司降级)。
建议顺序:先在 1 台客户端上验证有效,再决定是否在服务端统一做。不要一上来就改服务端 —— 出了问题影响面是整个公司。
六、方案 C:升级服务端与驱动(长期正解)
- 服务端打全补丁,并升级到仍在支持期内的系统(Win7 / Server 2008 R2 早已停止支持)
- 打印机驱动换成厂商最新版本,优先用 v4(类型 4)驱动
- 把共享打印迁到支持新认证级别的机器上,例如 Server 2016 及以上
这三条都是"下次别再犯"的动作,不能救今天下午的火,但能让你不用每季度回来找这篇文章。
七、一键脚本
把下面四个动作做成一个脚本:只读检测、写入兼容值、回滚、用 IP 直连建打印机。全部支持 -WhatIf 预览,不做任何你没确认过的改动。
# 只读检测(不改任何东西)
.\Fix-PrintSpooler011b.ps1 -Action Detect
# 预览将要改什么,不实际写入
.\Fix-PrintSpooler011b.ps1 -Action ApplyFallback -WhatIf
# 确认没问题再真改
.\Fix-PrintSpooler011b.ps1 -Action ApplyFallback
# 回滚
.\Fix-PrintSpooler011b.ps1 -Action RollbackFallback
# 用 IP 直连建打印机
.\Fix-PrintSpooler011b.ps1 -Action AddIpPrinter `
-PrinterName "3F-HP-M403" -PrinterIP 10.0.1.20 `
-DriverName "HP LaserJet Pro M403-M404 PCL 6"
展开完整脚本(约 300 行,保存为 Fix-PrintSpooler011b.ps1 后用)
#Requires -Version 5.1
<#
.SYNOPSIS
0x0000011b 共享打印机连接失败 —— 检测与修复工具
.DESCRIPTION
四种动作,全部可回滚:
Detect 只读检测:系统版本、RPC 认证开关、SMB 打印连接、后台处理程序状态
ApplyFallback 写入 RpcAuthnLevelPrivacyEnabled = 0 并重启 Spooler(临时措施,降低本机 RPC 认证级别)
RollbackFallback 移除该注册表值,恢复系统默认,并重启 Spooler
AddIpPrinter 用 TCP/IP 直连方式添加打印机(推荐方案,绕开 SMB 共享)
.PARAMETER Action
要执行的动作,默认 Detect。
.PARAMETER PrinterName
AddIpPrinter 时使用的打印机显示名称。
.PARAMETER PrinterIP
AddIpPrinter 时打印机的 IP 地址。
.PARAMETER DriverName
AddIpPrinter 时使用的驱动名称,必须与 Get-PrinterDriver 的输出完全一致。
.EXAMPLE
.\Fix-PrintSpooler011b.ps1 -Action Detect
.EXAMPLE
.\Fix-PrintSpooler011b.ps1 -Action ApplyFallback -WhatIf
.EXAMPLE
.\Fix-PrintSpooler011b.ps1 -Action AddIpPrinter -PrinterName "HP-M403" -PrinterIP 10.0.1.20 -DriverName "HP LaserJet Pro M403-M404 PCL 6"
.NOTES
最后更新:2026-10-20
适用:Windows 10 1809+ / Windows 11;Windows PowerShell 5.1 与 PowerShell 7 均可
提醒:ApplyFallback 会降低本机打印连接的认证要求,仅建议在可信内网临时使用。
#>
[CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')]
param(
[ValidateSet('Detect', 'ApplyFallback', 'RollbackFallback', 'AddIpPrinter')]
[string]$Action = 'Detect',
[string]$PrinterName,
[string]$PrinterIP,
[string]$DriverName
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$RegPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\Print'
$RegName = 'RpcAuthnLevelPrivacyEnabled'
$SvcName = 'Spooler'
# ---------------------------------------------------------------- 辅助函数
function Test-IsAdmin {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
function Get-RpcAuthValue {
$item = Get-ItemProperty -Path $RegPath -Name $RegName -ErrorAction SilentlyContinue
if ($null -eq $item) { return $null }
return $item.$RegName
}
function Restart-SpoolerInternal {
Write-Host ' -> 重启打印后台处理程序 (Spooler) ...'
Restart-Service -Name $SvcName -Force
$svc = Get-Service -Name $SvcName
Write-Host (" -> Spooler 当前状态:{0}" -f $svc.Status)
}
function Write-Head([string]$text) {
Write-Host ''
Write-Host $text -ForegroundColor Yellow
Write-Host ('-' * 34) -ForegroundColor DarkGray
}
# ---------------------------------------------------------------- Detect
function Invoke-Detect {
[CmdletBinding(SupportsShouldProcess = $true)]
param()
Write-Head '[1/5] 系统信息'
$os = Get-CimInstance -ClassName Win32_OperatingSystem
Write-Host (" 系统 :{0}" -f $os.Caption)
Write-Host (" Build :{0} 架构:{1}" -f $os.BuildNumber, $os.OSArchitecture)
Write-Host (" 计算机名:{0}" -f $env:COMPUTERNAME)
Write-Host (" 域/组 :{0}" -f $env:USERDOMAIN)
Write-Host (" PS 版本 :{0}" -f $PSVersionTable.PSVersion)
Write-Head '[2/5] RPC 认证级别开关'
Write-Host (" 路径:{0}" -f $RegPath)
Write-Host (" 名称:{0}" -f $RegName)
$val = Get-RpcAuthValue
if ($null -eq $val) {
Write-Host ' 当前:<未设置>(系统默认行为,等同要求 PKT_PRIVACY)' -ForegroundColor Gray
}
elseif ($val -eq 0) {
Write-Host ' 当前:0(已放宽,接受较低认证级别 —— 兼容老服务端)' -ForegroundColor Green
}
else {
Write-Host (" 当前:{0}(要求 PKT_PRIVACY)" -f $val) -ForegroundColor Green
}
Write-Head '[3/5] 打印后台处理程序'
$svc = Get-Service -Name $SvcName
Write-Host (" {0}:{1} 启动类型:{2}" -f $svc.Name, $svc.Status, $svc.StartType)
if ($svc.StartType -eq 'Disabled') {
Write-Host ' !! Spooler 被禁用。先执行:Set-Service Spooler -StartupType Automatic' -ForegroundColor Red
}
elseif ($svc.Status -ne 'Running') {
Write-Host ' !! Spooler 未运行。先执行:Start-Service Spooler' -ForegroundColor Red
}
Write-Head '[4/5] 当前打印机与连接方式'
$smbCount = 0
$readOk = $false
try {
$printers = @(Get-Printer -ErrorAction Stop)
$readOk = $true
if ($printers.Count -eq 0) {
Write-Host ' 本机没有已安装的打印机' -ForegroundColor Gray
}
else {
foreach ($p in $printers) {
Write-Host (" - {0}" -f $p.Name)
Write-Host (" 端口:{0} 驱动:{1} 状态:{2}" -f $p.PortName, $p.DriverName, $p.PrinterStatus) -ForegroundColor DarkGray
}
$smb = @($printers | Where-Object { $_.PortName -like '\\*' })
$smbCount = $smb.Count
if ($smbCount -gt 0) {
Write-Host ''
Write-Host (" 其中 SMB 共享连接:{0} 台(0x0000011b 主要影响这一类)" -f $smbCount) -ForegroundColor Cyan
foreach ($s in $smb) { Write-Host (" - {0} <- {1}" -f $s.Name, $s.PortName) }
}
}
}
catch {
Write-Host ' 读取打印机列表失败(这不等于没有打印机)' -ForegroundColor Red
Write-Host (" 原因:{0}" -f $_.Exception.Message) -ForegroundColor DarkGray
}
Write-Head '[5/5] 诊断建议'
if (-not $readOk) {
Write-Host ' 无法读取打印机列表,本次不做判断。' -ForegroundColor Red
Write-Host ' 请先确保:① 以管理员身份运行 ② Spooler 服务已启动,然后重新执行 Detect。' -ForegroundColor Red
return
}
$val = Get-RpcAuthValue
$fallbackOff = ($null -eq $val) -or ($val -ne 0)
if ($smbCount -gt 0 -and $fallbackOff) {
Write-Host ' 特征吻合:存在 SMB 共享打印连接,且本机未放宽 RPC 认证级别。' -ForegroundColor Cyan
Write-Host ' 建议顺序:' -ForegroundColor Cyan
Write-Host ' A. 改 IP 直连(根治,不降低安全性)—— 推荐'
Write-Host ' B. 本机临时放宽认证级别 —— 仅救急'
Write-Host ' C. 升级服务端系统与打印驱动 —— 长期正解'
Write-Host ''
Write-Host ' 预览 B 的改动: -Action ApplyFallback -WhatIf' -ForegroundColor DarkGray
}
elseif ($smbCount -eq 0) {
Write-Host ' 本机没有 SMB 共享打印连接。' -ForegroundColor Gray
Write-Host ' 如果确实报 0x0000011b,请确认报错发生在"添加打印机"这一步,而不是打印任务失败。' -ForegroundColor Gray
}
else {
Write-Host ' 本机已放宽 RPC 认证级别。若仍报 0x0000011b,问题多半在服务端权限或驱动,' -ForegroundColor Gray
Write-Host ' 请检查服务端的共享权限与打印驱动版本。' -ForegroundColor Gray
}
Write-Host ''
Write-Host ' 提示:0x0000011b 常与 0x00000709 同时出现,但后者是"设置默认打印机失败",解法不同。' -ForegroundColor DarkGray
}
# ---------------------------------------------------------------- ApplyFallback
function Invoke-ApplyFallback {
[CmdletBinding(SupportsShouldProcess = $true)]
param()
if (-not (Test-IsAdmin)) {
throw '需要管理员权限。请以管理员身份重新打开 PowerShell 后再执行。'
}
if (-not (Test-Path -Path $RegPath)) {
throw ("注册表路径不存在:{0}" -f $RegPath)
}
Write-Head '放宽本机打印 RPC 认证级别(写入 0)'
Write-Host ' 警告:这会降低本机打印连接的认证要求。' -ForegroundColor Red
Write-Host ' 仅建议在可信内网、且无法改用 IP 直连时临时使用;用完请执行 RollbackFallback。' -ForegroundColor Red
if ($PSCmdlet.ShouldProcess("$RegPath\$RegName", '设置 DWORD 值为 0')) {
New-ItemProperty -Path $RegPath -Name $RegName -PropertyType DWord -Value 0 -Force | Out-Null
Write-Host ' -> 已写入 0' -ForegroundColor Green
Restart-SpoolerInternal
Write-Host ' -> 完成。请重新连接共享打印机(先删除旧连接再加一次)。'
}
else {
Write-Host ' -> [WhatIf] 预览模式,未做任何修改。' -ForegroundColor Yellow
}
}
# ---------------------------------------------------------------- RollbackFallback
function Invoke-RollbackFallback {
[CmdletBinding(SupportsShouldProcess = $true)]
param()
if (-not (Test-IsAdmin)) {
throw '需要管理员权限。请以管理员身份重新打开 PowerShell 后再执行。'
}
Write-Head '恢复系统默认(移除该注册表值)'
if ($null -eq (Get-RpcAuthValue)) {
Write-Host ' 该值当前不存在,已经是系统默认状态,无需回滚。' -ForegroundColor Gray
return
}
if ($PSCmdlet.ShouldProcess("$RegPath\$RegName", '移除该值')) {
Remove-ItemProperty -Path $RegPath -Name $RegName -Force
Write-Host ' -> 已移除,恢复系统默认' -ForegroundColor Green
Restart-SpoolerInternal
}
else {
Write-Host ' -> [WhatIf] 预览模式,未做任何修改。' -ForegroundColor Yellow
}
}
# ---------------------------------------------------------------- AddIpPrinter
function Invoke-AddIpPrinter {
[CmdletBinding(SupportsShouldProcess = $true)]
param()
if (-not (Test-IsAdmin)) {
throw '需要管理员权限。请以管理员身份重新打开 PowerShell 后再执行。'
}
if ([string]::IsNullOrWhiteSpace($PrinterName) -or [string]::IsNullOrWhiteSpace($PrinterIP)) {
throw '需要同时指定 -PrinterName 与 -PrinterIP。'
}
Write-Head ("用 IP 直连方式添加打印机:{0} -> {1}" -f $PrinterName, $PrinterIP)
$ping = Test-Connection -ComputerName $PrinterIP -Count 2 -Quiet
if (-not $ping) {
Write-Host ' !! 该 IP 无法 ping 通。请先确认打印机已开机、IP 正确、与本机同网段。' -ForegroundColor Red
Write-Host ' 部分打印机默认关闭 ICMP,ping 不通不代表不可用,可继续尝试。' -ForegroundColor DarkGray
}
$portName = 'IP_' + $PrinterIP
$existingPort = Get-PrinterPort -Name $portName -ErrorAction SilentlyContinue
if ($null -eq $existingPort) {
if ($PSCmdlet.ShouldProcess($portName, '创建 TCP/IP 打印机端口')) {
Add-PrinterPort -Name $portName -PrinterHostAddress $PrinterIP
Write-Host (" -> 已创建端口 {0}" -f $portName) -ForegroundColor Green
}
}
else {
Write-Host (" -> 端口已存在:{0}" -f $portName) -ForegroundColor Gray
}
$existingPrinter = Get-Printer -Name $PrinterName -ErrorAction SilentlyContinue
if ($null -ne $existingPrinter) {
Write-Host (" -> 同名打印机已存在:{0},跳过创建" -f $PrinterName) -ForegroundColor Gray
return
}
if ([string]::IsNullOrWhiteSpace($DriverName)) {
Write-Host ' !! 未指定 -DriverName。本机已安装的打印驱动如下:' -ForegroundColor Red
Get-PrinterDriver | ForEach-Object { Write-Host (" {0}" -f $_.Name) }
Write-Host ' 请从上面原样复制一个名称,用 -DriverName 参数传入后重试。' -ForegroundColor Red
return
}
$driver = Get-PrinterDriver -Name $DriverName -ErrorAction SilentlyContinue
if ($null -eq $driver) {
throw ("本机没有名为 '{0}' 的打印驱动。请先安装驱动,或用 -DriverName 指定已有驱动。" -f $DriverName)
}
if ($PSCmdlet.ShouldProcess($PrinterName, '创建打印机')) {
Add-Printer -Name $PrinterName -DriverName $DriverName -PortName $portName
Write-Host (" -> 已添加打印机 {0}" -f $PrinterName) -ForegroundColor Green
}
}
# ---------------------------------------------------------------- 入口
Write-Host ''
Write-Host '0x0000011b 共享打印机排障工具 | 只读检测请用 -Action Detect' -ForegroundColor Cyan
Write-Host ("当前动作:{0}" -f $Action) -ForegroundColor Cyan
switch ($Action) {
'Detect' { Invoke-Detect -WhatIf:$WhatIfPreference }
'ApplyFallback' { Invoke-ApplyFallback -WhatIf:$WhatIfPreference }
'RollbackFallback' { Invoke-RollbackFallback -WhatIf:$WhatIfPreference }
'AddIpPrinter' { Invoke-AddIpPrinter -WhatIf:$WhatIfPreference }
}
Write-Host ''
Write-Host '完成。' -ForegroundColor Cyan
八、怎么确认真的修好了
- 看连接状态:
Get-Printer -Name "3F-HP-M403" | Format-List Name,PortName,PrinterStatus,JobCount - 打一张测试页:
rundll32 printui.dll,PrintUIEntry /k /n "3F-HP-M403" - 看日志:事件查看器 → 应用程序和服务日志 → Microsoft → Windows → PrintService → Operational,确认没有新的错误
- 重启一次再打一张。这一步别省 —— 很多"改完能用"是因为服务还没重启完,一重启就复发。
九、踩过的坑
- 值类型建成字符串。必须是 DWORD(32 位)。建成 REG_SZ 不会报错,只会"莫名其妙没效果",最难查。
- 只重启电脑不重启服务。Spooler 必须单独重启,
Restart-Service Spooler -Force最稳。 - 不删旧连接就重连。控制面板里残留的连接会缓存旧凭据,直接"再连一次"往往还是同样的报错,要先删掉再添加。
- Windows 更新把补丁装回来。降级方案可能在某次更新后失效,所以要记录在变更单里,或者干脆走方案 A。
- 把 0x00000709 当成同一个问题。两者经常一起出现,但 0x00000709 是"设置默认打印机失败",解法不同,别混着改。
- 群晖 / NAS 的打印服务基本救不了。它们的 CUPS 对 PKT_PRIVACY 支持很差,现实中只有两个选择:IP 直连,或者服务端降级。
- 服务端是 Win7 时装不上 v4 驱动。提前备一份 v3 驱动,否则现场会卡住。
十、不是这个问题的情况
下面几个报错长得像,原因完全无关,别照着本文改:
0x00000709—— 无法设置默认打印机,多半是残留的默认打印机记录冲突0x80070035—— 找不到网络路径,方向是 SMB / 网络发现 / NetBIOS0x80070005—— 拒绝访问,方向是共享权限与账号0x00000bbb—— 驱动或端口配置问题
关于本文示例:文中的主机名、IP、打印机名全部是示例(10.0.1.20、3F-HP-M403、corp.example.com),请替换成你自己的环境。这类文章最容易犯的错就是截图带出真实内网信息。
修改注册表前请先导出备份,脚本的所有写入动作都支持 -WhatIf 预览和 RollbackFallback 回滚。