«

Windows 共享打印机报错 0x0000011b:别再重装驱动了,三步解决

tenai 发布于 阅读:1034 报错速查


共享打印机突然连不上,报 0x0000011b。九成的人第一反应是重装驱动、改共享权限、重启电脑 —— 全是白费。这个问题跟驱动和权限都没关系,三分钟能判断清楚。

最后更新 2026-10-20 适用 Windows 10 1809+ / Windows 11 脚本验证 PowerShell 5.1

一、30 秒判断:这是不是你的问题

三条全部命中,才是本文说的问题
  1. 报错原文是 「无法连接到打印机。操作无法完成(错误 0x0000011b)」,而且出现在添加 / 连接打印机的过程中,不是点打印的时候。
  2. 打印机是通过 \\服务器名\打印机名 这种方式装的(走 SMB 共享),不是 IP 端口直连。
  3. 客户端是 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

八、怎么确认真的修好了

  1. 看连接状态:Get-Printer -Name "3F-HP-M403" | Format-List Name,PortName,PrinterStatus,JobCount
  2. 打一张测试页:rundll32 printui.dll,PrintUIEntry /k /n "3F-HP-M403"
  3. 看日志:事件查看器 → 应用程序和服务日志 → Microsoft → Windows → PrintService → Operational,确认没有新的错误
  4. 重启一次再打一张。这一步别省 —— 很多"改完能用"是因为服务还没重启完,一重启就复发。

九、踩过的坑

  1. 值类型建成字符串。必须是 DWORD(32 位)。建成 REG_SZ 不会报错,只会"莫名其妙没效果",最难查。
  2. 只重启电脑不重启服务。Spooler 必须单独重启,Restart-Service Spooler -Force 最稳。
  3. 不删旧连接就重连。控制面板里残留的连接会缓存旧凭据,直接"再连一次"往往还是同样的报错,要先删掉再添加。
  4. Windows 更新把补丁装回来。降级方案可能在某次更新后失效,所以要记录在变更单里,或者干脆走方案 A。
  5. 把 0x00000709 当成同一个问题。两者经常一起出现,但 0x00000709 是"设置默认打印机失败",解法不同,别混着改。
  6. 群晖 / NAS 的打印服务基本救不了。它们的 CUPS 对 PKT_PRIVACY 支持很差,现实中只有两个选择:IP 直连,或者服务端降级。
  7. 服务端是 Win7 时装不上 v4 驱动。提前备一份 v3 驱动,否则现场会卡住。

十、不是这个问题的情况

下面几个报错长得像,原因完全无关,别照着本文改:

  • 0x00000709 —— 无法设置默认打印机,多半是残留的默认打印机记录冲突
  • 0x80070035 —— 找不到网络路径,方向是 SMB / 网络发现 / NetBIOS
  • 0x80070005 —— 拒绝访问,方向是共享权限与账号
  • 0x00000bbb —— 驱动或端口配置问题

关于本文示例:文中的主机名、IP、打印机名全部是示例(10.0.1.20、3F-HP-M403、corp.example.com),请替换成你自己的环境。这类文章最容易犯的错就是截图带出真实内网信息。

修改注册表前请先导出备份,脚本的所有写入动作都支持 -WhatIf 预览和 RollbackFallback 回滚。

共享 打印机 WIN 报错