打印机共享这四个字,看着平平无奇,真上手能把人磨到没脾气。我这些年帮朋友、帮公司行政处理过的打印机问题,没有一百也有八十起了:主机的打印机明明共享出去了,隔壁工位的电脑就是搜不到;昨天还打得欢,今天开机弹一个 0x00000709;Win11 的笔记本去连 Win7 老台式机共享出来的机器,系统直接甩一句"操作失败",连错误码都懒得翻译;更别提 Linux 那边,Ubuntu 里 CUPS 显示打印机在线,任务也发出去了,纸一张都不吐。这些问题的根源其实高度集中在几个点上,只是 Windows 把它们包装成了看起来毫不相干的错误码。
这篇内容我想把两件事讲透:一是打印机共享到底该怎么设才能一次成功,二是共享失败之后,怎么从错误码反推出真正出问题的那一环。不管你是家里两台电脑共用一台打印机,还是小办公室里十几台机器连一个主机,或者你用的是 Ubuntu、macOS 去连 Windows 共享,下面这些东西都能直接抄。文章里会给出完整的操作路径、注册表位置、脚本命令,还有我自己踩过的坑。看完你至少能做到:别人报个错误码过来,你大概知道该先动哪一步。
1. 共享打印机之前,先把三条技术路线选明白
很多人一上来就问"共享怎么设置",其实这个问题问早了。打印机共享不是一种技术,而是三种完全不同的实现方式,选错了路线,后面怎么调都是事倍功半。
1.1 主机直连共享、网络打印服务器、IPP 免驱三条路的取舍
第一条路是主机直连共享,也就是最常见的做法:一台电脑用 USB 线连着打印机,装上驱动,然后把这台电脑当成"打印服务器"把打印机共享出去。它的优势是零成本、不用买任何东西,家用和小办公室最划算。代价是那台主机必须开机,而且它的网络、系统补丁、休眠策略全都直接影响其他人能不能打印。
第二条路是打印机自带网口,或者加一个打印服务器小盒子。打印机直接插网线拿一个独立 IP,所有电脑都用 IP 去连它。这条路最稳,因为它不依赖任何一台电脑的开机状态,谁关机都不影响。现在几百块的激光一体机基本都带网口和无线,买之前看一眼有没有 RJ45 口,能省掉后面一大半麻烦。
第三条路是 IPP Everywhere / AirPrint / Mopria 这类免驱协议。近几年的打印机普遍支持,Windows 10 之后添加设备时会自动按 IPP 方式发现,macOS 和 iOS、安卓也原生支持。它最大的好处是不用装厂商驱动,系统自带一套通用驱动就能打,出问题的概率比共享低得多。
三条路的对比我整理成下面这张表,选之前对着看一遍:
| 路线 | 成本 | 稳定性 | 依赖主机开机 | 适合场景 |
|---|---|---|---|---|
| 主机直连共享(SMB) | 零 | 中 | 是 | 家用、两三台机器 |
| 打印机网口 / 打印服务器 | 中 | 高 | 否 | 小办公室、多台机器 |
| IPP / AirPrint 免驱 | 零 | 高 | 否 | 新打印机、混合系统 |
提示:如果你现在的打印机带网口,别犹豫,直接用 IPP 或 IP 直连,把"共享"这件事绕过去,后面所有错误码都跟你没关系了。本文后面大部分篇幅讲的是第一条路,因为坑基本都在那儿。
1.2 为什么 Windows 共享这么容易翻车:三方博弈的结果
要理解报错,得先理解 Windows 共享打印其实是好几套机制摞在一起。
最底下是SMB 文件共享通道(走 445 端口),客户端要先通过它拿到共享出来的打印机"入口"。上面一层是RPC 远程过程调用(走 135 端口加一段动态端口),用来远程操作打印子系统。再上面是Print Spooler 打印后台处理程序,负责收任务、排队、把数据丢给驱动。最后还有一层Point and Print 驱动分发,决定客户端能不能自动把驱动从主机拉过来装上。
这四层里任何一层被系统补丁、组策略、防火墙、第三方安全软件掐掉,前端给你弹的都是一个笼统的错误码。这就是为什么同一个 0x00000709,网上能搜出十几种"解法",有的管用有的不管用——因为大家坏的其实不是同一层。想清楚这一点,排查的时候你就不会乱试了,而是按层往下剥。
还有个很多人忽略的点:共享打印对网络环境异常敏感。同一个交换机下,有线连的机器稳如老狗,Wi-Fi 连的机器三天两头掉,多半是无线的省电策略或者 AP 隔离在捣鬼。这类问题不看错误码,看的是网络拓扑。
2. 共享端设置:把打印机稳稳地共享出去
这一节讲的是"主机"要怎么配。我见过太多失败案例,问题根本不在客户端,而在于主机这边少勾了一个选项。按下面的顺序走一遍,能规避掉八成问题。
2.1 开共享之前的网络前置检查
先确认三件事,这三件事不确认,后面全是白干。
第一,两台机器在同一个网段、同一个工作组。家用路由器一般是 192.168.1.x 或 192.168.0.x,IP 前三段一样才叫同一网段。工作组默认都是 WORKGROUP,如果你改过,两台机器必须一致。查看和修改在"此电脑 → 属性 → 高级系统设置 → 计算机名"里。
第二,网络位置必须是"专用网络"。Windows 把网络分成专用和公用两种,公用网络下文件和打印机共享是默认关掉的,而且防火墙规则更严。切换到专用网络的入口在"设置 → 网络和 Internet → 以太网/WLAN → 网络配置文件类型"。这一步特别容易被忽略,尤其是插网线之后系统默认给的是公用网络。
第三,主机用固定 IP。DHCP 分配的地址会变,今天客户端连的是 192.168.1.10,明天主机重启变成 192.168.1.15,客户端那个快捷方式就废了。在路由器里做 IP-MAC 绑定,或者主机上手动设静态 IP 都行。我个人的习惯是:所有需要被共享的机器,一律在路由器里绑定 IP,省得以后找不到人。
注意:如果你是无线连接,先在路由器里关掉"AP 隔离"或"客户端隔离"。这个功能一开,同一个 Wi-Fi 下的设备互相看不见,表现就是"网络正常但就是搜不到共享",特别隐蔽。
2.2 打印机共享与 Everyone 权限的正确配置
主机上的打印机驱动装好、能正常打印之后,开始共享。
打开"控制面板 → 设备和打印机",找到那台打印机,右键 →打印机属性→ 切到共享选项卡 → 勾选"共享这台打印机" → 填写共享名。
这里的共享名有个讲究:用简短的英文或数字,不要用中文、空格和特殊符号。比如HP1108、OFFICE01。中文共享名在很多场景下会引发编码问题,表现就是客户端能找到但连不上,或者"从服务器获取共享列表失败:无效的参数"。这个坑我踩过,改了名就好了,前后折腾了半小时。
接着切到安全选项卡,点"编辑"→"添加",输入Everyone,确定之后在权限列表里勾上"打印"。只需要给"打印"权限,"管理此打印机"不要给——给了别人就能删你的打印任务、改驱动,没必要。
如果你希望更精细一点,可以只添加具体用户而不是 Everyone,比如打印专用账号。在小办公室里建一个专门的本地账户给打印用,比开来宾账户安全得多,后面会细说。
2.3 网络发现、密码保护共享与 SMB 协议的关键开关
回到"控制面板 → 网络和共享中心 → 高级共享设置",展开"专用"那一栏,确认这几项:
- 启用网络发现
- 启用文件和打印机共享
- 允许 Windows 管理家庭组连接(新系统已无此项)
然后往下拉到"所有网络"那一栏:
- 公用文件夹共享:开不开都行,不影响打印
- 密码保护的共享:这是关键点
"密码保护的共享"如果是"启用",那么客户端连过来必须提供主机上一个有效的账户密码。如果是"关闭",则允许以访客身份连接。企业环境建议启用并用专用账户,家用环境可以关闭省事。
再往下是 SMB 协议。Windows 10 1709 之后,SMB1 默认被卸载了,因为它的安全性太差。但一些老设备、老 NAS、老打印机内置的共享服务只认 SMB1。如果你要连的是这类老家伙,需要手动装回来:
"控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 找到 SMB 1.0/CIFS 文件共享支持 → 展开 → 勾选客户端和服务器"。
提示:SMB1 的安全性确实不好,装回来之后建议只在内网用,外网能碰到的机器千万别开。如果只是客户端这边需要,勾"客户端"就够;主机要对外提供老协议共享,才勾"服务器"。
还有一个更隐蔽的策略:从 Windows 10 1809 开始,默认禁止"不安全的来宾登录"。这意味着即便你关了密码保护共享,客户端也可能因为来宾被策略拦住而连不上,报的错往往就是 0x0035 或者"找不到网络路径"。这个开关在组策略里:
"运行 gpedit.msc → 计算机配置 → 管理模板 → 网络 → Lanman 工作站 → 启用不安全的来宾登录",设为"已启用"。家庭版没有组策略编辑器,得走注册表。
2.4 防火墙和端口:把该放行的放行
Windows 防火墙默认会放行"文件和打印机共享"这个规则组,但很多安全软件、优化工具会把它关掉。检查方式:打开"Windows Defender 防火墙 → 允许应用或功能通过防火墙",往下找"文件和打印机共享",确保"专用"那一列是勾上的。
如果嫌点来点去麻烦,管理员权限的命令提示符里一条命令搞定:
netsh advfirewall firewall set rule group="文件和打印机共享" new enable=Yes英文系统里把组名换成File and Printer Sharing即可。
共享打印涉及的端口不止一个,我把它们列出来,方便你用 telnet 或端口工具逐个验证:
| 端口 | 协议 | 作用 | 不通时的典型现象 |
|---|---|---|---|
| 445/TCP | SMB | 现代共享主通道 | 报 0x0035 找不到网络路径 |
| 139/TCP | NetBIOS over TCP | 老系统共享通道 | 老设备连不上共享 |
| 135/TCP | RPC 端点映射 | 定位远程打印服务 | 打印相关 RPC 调用失败 |
| 49152-65535/TCP | RPC 动态端口 | 打印子系统远程调用 | 报 0x0000011b 一类错误 |
| 9100/TCP | RAW/JetDirect | 带网口打印机直打 | 网络打印机不响应 |
| 631/TCP | IPP | 标准打印协议 | IPP 方式连不上 |
在客户端上验证 445 通不通,最土但最好用的办法:
telnet 192.168.1.10 445连上了屏幕会变黑或者闪一下,连不上会提示连接失败。Win10 之后 telnet 客户端默认没装,可以在"启用或关闭 Windows 功能"里勾上,或者直接用 PowerShell:
Test-NetConnection 192.168.1.10 -Port 4453. 客户端连接:Win10/Win11 添加共享打印机的几种姿势
主机配好了,接下来是客户端。这里我要强调一句:不要只用"添加打印机"里面那个自动搜索,那个功能依赖网络浏览服务,是老架构留下的东西,在网络环境稍微复杂一点的地方就不灵。下面几种方式从易到难,建议直接用第二种。
3.1 常规添加流程与凭据弹窗怎么填
标准路径是"设置 → 蓝牙和其他设备 → 打印机和扫描仪 → 添加设备",等它搜。如果搜到了直接点就行。搜不到就点"我需要的打印机不在列表中",然后选"按名称选择共享打印机",在框里输入:
\\192.168.1.10\HP1108这里我强烈建议用 IP 而不是主机名。主机名解析依赖 NetBIOS 或者 mDNS,在有些网络里会失败或者很慢;IP 是直接的,只要网络通就行。
输入之后如果主机开了密码保护共享,会弹一个凭据窗口,让你填用户名和密码。用户名要写成主机名\用户名或者IP\用户名的格式,比如192.168.1.10\printuser,光填用户名有时候不认。密码就是主机上那个账户的密码。勾上"记住我的凭据",以后就不用反复输了。
如果填完凭据还是报错,去"控制面板 → 凭据管理器 → Windows 凭据"里看看是不是存了旧密码,删掉重来。
3.2 用本地端口直连:绕过网络浏览列表的最稳方案
这是我个人最推荐的方式,几乎百试百灵,因为它完全跳过了"搜索/浏览"这一层,直接建立 SMB 连接。
操作路径:添加打印机 → "我需要的打印机不在列表中" → 选"通过手动设置添加本地打印机或网络打印机"→ 下一步 → 选"创建新端口",端口类型选Local Port→ 下一步 → 在"输入端口名"里填:
\\192.168.1.10\HP1108然后下一步,选打印机厂商和型号,装驱动,完成。
这个方式的原理是:Windows 会为这个 UNC 路径创建一个本地端口,打印任务直接往这个端口投递,走的是标准 SMB 通道,不经过网络浏览服务,也不依赖 Function Discovery 那些组件。所以那些"从服务器获取共享列表失败"的毛病,在这个方式下根本不会出现。
同理,如果你的打印机是带网口的,可以直接建一个Standard TCP/IP Port,填打印机 IP,协议选 RAW,端口号 9100;或者选 IPP,URL 填http://打印机IP:631/ipp/print。这两种方式对打印机本身的固件有要求,新机器基本都支持。
3.3 驱动与 Point and Print:别让客户端去主机上找驱动
共享打印最容易出问题的一环就是驱动分发。默认情况下,客户端连接共享打印机时,会尝试从主机把驱动拉下来自动安装。这里有几个坑:
第一,架构要对上。如果共享主机是 32 位系统,客户端是 64 位系统,主机上必须额外装一份 64 位驱动,否则客户端拉不到,会报驱动安装失败。现在 32 位系统基本绝迹了,但老办公室里还能见到。
第二,非管理员用户装不了驱动。从某个 Windows 版本开始,微软收紧了 Point and Print 的默认策略,普通用户连共享打印机时如果需要装驱动,会被拦下来,报的错五花八门,0x0000011b 就经常出现在这里。
绕过的办法有两个。上策是在客户端先本地装一遍同型号驱动,装好之后再去连接共享打印机,这时系统发现驱动已存在,就不会去主机拉,直接就通了。下策是改策略,在客户端(或通过域策略)放开驱动安装权限,注册表位置在:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint RestrictDriverInstallationToAdministrators = 0第三,那个被传烂了的 RpcAuthnLevelPrivacyEnabled。很多 0x00000709、0x0000011b 的问题,本质是打印后台的 RPC 认证级别被提高了,客户端和主机协商不上。把下面这个值设为 0,让认证回到宽松级别,能解决一大票问题:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print] "RpcAuthnLevelPrivacyEnabled"=dword:00000000改完必须重启打印后台处理程序才生效:
net stop spooler net start spooler注意:这个开关会降低打印 RPC 的认证强度,只在你能控制的内网里用。跨网段、跨部门的场景要慎重,最好走正规的域策略和驱动分发方案。
4. 错误码逐个拆:每种报错背后真正坏掉的那一环
到了这一节,就是干货密度最高的地方了。我把共享打印最常见的错误码整理成一张表,然后再一个个拆开讲。
| 错误码 | 字面含义 | 最常见触发场景 | 一线的处置动作 |
|---|---|---|---|
| 0x00000012 | 没有更多文件 | 网络浏览列表拉取失败 | 启用发现类服务,或直接用 UNC 路径 |
| 0x00000006 | 句柄无效 | 后台处理程序卡死、驱动残留 | 清空 spool 目录、删残留驱动、重启服务 |
| 0x00000709 | 打印机名称/默认打印机异常 | 同名残留设备、驱动冲突 | 清理同名设备 + RpcAuthnLevelPrivacyEnabled |
| 0x00000520 | 登录会话不存在 | 凭据会话失效 | 清凭据管理器、重启 Workstation 服务 |
| 0x00000040 | 网络名不再可用 | 主机会话掉线、休眠 | 关睡眠、固定 IP、重启相关服务 |
| 0x0035 / 0x35 | 找不到网络路径 | 防火墙拦截、名称解析失败 | 改用 IP、放行文件和打印机共享 |
| 0x0000011b | RPC 认证级别过高 | 系统打补丁之后 | RpcAuthnLevelPrivacyEnabled 置 0 |
4.1 0x00000012 与 0x00000006:列表类故障和句柄类故障
0x00000012的字面意思是"没有更多文件"。它几乎总是伴随"从服务器获取共享列表失败"一起出现,问题出在**网络浏览(Network Browser)**这条链路上。Windows 早期靠一台"主浏览器"来维护网上邻居的列表,现在这套机制虽然还在,但已经半废了。
处置顺序:先看Function Discovery Provider Host、Function Discovery Resource Publication、Computer Browser这三个服务的状态,改成自动并启动;如果还是不行,直接放弃自动搜索,改用第 3.2 节的 Local Port 方式,问题秒解。这也是为什么我一开始就说别依赖自动搜索。
0x00000006是"句柄无效",这类错误基本可以锁定在打印后台处理程序上。常见原因是某个打印任务卡死在队列里,spool 目录下堆积了坏文件,或者之前装过同一型号的驱动没卸干净,注册表里留了残骸。
处置办法:把打印服务停掉,清空 spool 目录,再启起来:
net stop spooler del /Q /F C:\Windows\System32\spool\PRINTERS\* net start spooler删除PRINTERS目录里的文件是安全的,那里面就是排队中的任务缓存,删掉等于清空队列。如果清完还报 06,就要去"打印机服务器属性 → 驱动程序"里把同一型号的残留驱动删掉重装。
4.2 0x00000709:名字冲突、默认打印机和 RPC 三件事
"操作无法完成(错误 0x00000709)再次检查打印机名称,并确保打印机已连接到网络"——这句话本身没什么信息量,它是三个不同原因共用的一个出口。
原因一:客户端已经有同名打印机了。Windows 允许存在多个同名打印机,但把它们切换成默认打印机的时候就会冲突。去"设备和打印机"里看看是不是有好几个叫HP1108的图标,把它们全删掉重加。
原因二:默认打印机指向了一个已经消失的设备。比如你之前连的共享打印机后来删了,但默认打印机还指着它,系统每次调用默认打印机就报 709。手动把默认打印机改成别的,再删掉幽灵设备。
原因三:RPC 认证级别。这就是前面说的RpcAuthnLevelPrivacyEnabled,改成 0 之后重启 spooler,一大批 709 会消失。
我自己处理 709 的习惯顺序是:先清理同名设备(30 秒),不行再改注册表(2 分钟),再不行就上 Local Port 大法。三步之内基本都能解决。
4.3 0x0035 和 0x00000520:网络路径与会话失效的区别
0x0035就是十进制的 53,含义是ERROR_BAD_NETPATH——找不到网络路径。这个错误的指向非常明确:客户端压根没能和主机建立连接。排查顺序是:
ping 192.168.1.10通不通Test-NetConnection 192.168.1.10 -Port 445通不通- 主机防火墙的"文件和打印机共享"规则是否放行
- 主机上"启用文件和打印机共享"是否勾上
- 共享名是不是中文(改成英文)
这五点里任何一点不满足,都会报 0035。我自己遇到最多的是第 3 点,装了个安全软件之后规则被悄悄关了。
0x00000520是"登录会话不存在或已被终止",它跟 0035 的层次不一样——连接是通的,但身份验证这一层的会话已经失效了。典型场景是主机重启过、账户密码改过、或者凭据缓存的会话被系统回收了。
处置:打开"控制面板 → 凭据管理器 → Windows 凭据",把跟这个主机相关的条目全部删除,然后重新连接一次,重新输入用户名密码。如果还不行,重启客户端的Workstation服务和主机的Server服务:
net stop workstation /y net start workstation主机那边:
net stop server /y net start server这两个服务是 SMB 的客户端和服务端引擎,共享相关的会话数据都归它们管,重启它们相当于把会话层清了一遍。
4.4 0x00000040:会话被掐断,多半是主机"睡着了"
ERROR_NETNAME_DELETED,字面意思是"指定的网络名不再可用"。这个错误的出现时机很关键:如果你是打印打到一半、或者放置一段时间后再去点打印才报这个,那几乎可以确定是主机进入了睡眠或者断开了网络。
Windows 默认的睡眠时间一般是 15 到 30 分钟。主机的网卡一旦跟着系统睡下去,客户端的 SMB 会话就断了,再唤醒的时候会话 ID 已经对不上,就报 40。
处置:
- 主机"电源和睡眠"里把睡眠和休眠设为"从不",至少在有打印需求的时段
- Win10/Win11 的"快速启动"关掉(控制面板 → 电源选项 → 选择电源按钮的功能 → 更改当前不可用的设置 → 取消勾选"启用快速启动")
- 网卡属性 → 电源管理 → 取消"允许计算机关闭此设备以节约电源"
- 主机 IP 固定下来
无线连接的场景下,还要注意 AP 的空闲踢除策略,有些企业级 AP 会把长时间没流量的客户端踢下线,表现跟这个一模一样。
4.5 顺带说说 0x0000011b:补丁留下的经典问题
虽然热搜里没怎么提,但只要是 2021 年下半年之后开始搞共享打印的人,基本都撞过这个。某个系统补丁把打印 RPC 的认证级别提高了,导致大量之前正常的共享环境一夜之间全部报0x0000011b。
处置办法有两个方向:一是打后续的修复补丁,微软后来出了缓解方案;二就是前面那个注册表开关,把RpcAuthnLevelPrivacyEnabled置 0。企业环境如果不想降级认证,就得老老实实上域环境加正规的打印服务器,这是长期方案。
5. 特殊场景:Win11 连 Win7、Linux 连 Windows
前面讲的是通用路径。实际工作里,麻烦基本都出在"跨代"和"跨系统"这两个场景上。
5.1 Win11/Win10 连 Win7 共享打印机:三个最容易漏的点
Win11 的笔记本去连 Win7 老台式机共享出来的打印机,是现在小办公室里最常见的组合,也是最容易翻车的组合。除了前面说的常规配置,还有三个点必须单独处理。
第一,SMB1 必须装回来。Win7 默认用 SMB1 协商,而 Win11 已经完全移除了这个组件。装回来之后,Win11 客户端那边勾"客户端"就够,主机(Win7)那台不用动,它本来就有。不装的话表现是:能看到共享、能点连接,但到某一步就失败,错误码不固定。
第二,来宾登录策略。Win7 上的共享往往是开来宾的,而 Win11 默认拒绝不安全来宾登录。前面讲过,组策略里把"启用不安全的来宾登录"设为已启用,或者走注册表:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters] "AllowInsecureGuestAuth"=dword:00000001第三,也是最省事的一招:别用来宾,建个专用账户。在 Win7 那台上建一个本地账户,比如print,设个简单密码,然后把这个账户加到"允许打印"的名单里。客户端连的时候填Win7主机名\print加密码,一次记住,从此不再出问题。
为什么这一招最省事?因为它绕开了"来宾"这条注定要被微软一步步收紧的路。来宾登录在安全上确实站不住,微软每次大版本都在削它,你今年配通了,明年系统更新一次可能又废了。专用账户这条路,在未来几年内都是稳的。
5.2 Ubuntu/Linux 连 Windows 共享打印机:能连上但打不出来是为什么
Linux 这边的情况跟 Windows 完全不同:它连上打印机的成功率其实更高,但"连上了不出纸"的比例也更高。原因在于驱动层。
先装必备组件:
sudo apt update sudo apt install smbclient cups cups-client cups-filters先用 smbclient 验证共享能不能看到:
smbclient -L //192.168.1.10 -U print如果这一步列出了共享列表,说明网络和凭据都没问题。看不到的话,先回头检查主机的防火墙和 SMB1。
然后在 CUPS 里添加。打开浏览器访问http://localhost:631,进 Administration → Add Printer,连接串填:
smb://print:密码@192.168.1.10/HP1108也可以直接用命令行添加,更利索:
lpadmin -p WinShare -E -v "smb://print:密码@192.168.1.10/HP1108" -m everywhere cupsenable WinShare cupsaccept WinShare关键在-m这个参数,也就是驱动选择。优先级是:厂商提供的 Linux PPD 文件 >everywhere(IPP Everywhere 通用驱动)> 具体的 PCL/PostScript PPD >raw(完全不处理,把数据原样丢过去)。
如果你在 CUPS 里点了打印,任务状态显示completed但打印机一动不动,八成是驱动不对。最快的验证办法是把驱动改成raw再试一次:如果 raw 模式下能打出一堆乱码文本,说明通路完全没问题,问题 100% 在驱动;如果 raw 也不出纸,那就是通路问题,回去查 SMB 和共享权限。
还有一个特别隐蔽的坑:双向支持(Bidirectional)。CUPS 默认会通过 SNMP 查询打印机的状态,某些 Windows 共享的打印机不支持 SNMP,或者中间隔了防火墙,CUPS 就会一直卡在"查询状态"这一步,队列显示处理中但就是不动。解决办法是在 CUPS 的这台打印机设置里,把"双向支持"之类的选项关掉,或者直接在 Windows 主机那边把 SNMP 状态查询关掉。
检查打印队列状态用:
lpstat -p WinShare -o测一张测试页:
lp -d WinShare /usr/share/cups/data/testprintmacOS 的做法更简单,系统设置里添加打印机选"IP"标签页,协议选 IPP 或 LPD,或者在"Windows"标签页里直接浏览工作组。不过 macOS 同样会遇到驱动匹配问题,思路跟 Linux 一致。
6. "从服务器获取共享列表失败"两类报错的定点处理
这个提示框是很多人搜索时的原话,它后面通常跟着两种后缀,对应的问题完全不一样。
6.1 后缀是"无效的参数"
这个错误出在网络发现的组件链上。Windows 想列出网络上的共享列表,需要依赖四个服务协同工作:
| 服务名 | 显示名 | 作用 |
|---|---|---|
| fdPHost | Function Discovery Provider Host | 提供发现接口 |
| FDResPub | Function Discovery Resource Publication | 把自己发布出去 |
| SSDPSRV | SSDP Discovery | 简单服务发现 |
| upnphost | UPnP Device Host | UPnP 设备托管 |
这四个里任何一个没启动,或者启动类型是"手动"但被系统闲置停掉了,都会导致列表拉取失败。
批量检查的命令:
Get-Service fdPHost, FDResPub, SSDPSRV, upnphost | Select-Object Name, Status, StartType如果状态不是 Running,用管理员权限启动并设为自动:
sc config fdPHost start= auto sc config FDResPub start= auto sc config SSDPSRV start= auto sc config upnphost start= auto net start fdPHost net start FDResPub net start SSDPSRV net start upnphost注意sc config里start=后面必须有一个空格再跟auto,这是 sc 命令的语法要求,写成start=auto会报错,很多人卡在这儿。
还有两个附加条件:网络位置要是"专用",以及 SMB1 组件如果被卸载了,老式的浏览服务也可能拉不到列表。满足这些条件之后,如果还是"无效的参数",就别折腾了,直接用 UNC 路径连,这是根本不依赖发现服务的方案。
6.2 后缀是"重置时断开网络连接"
这个提示听起来像网络断了,实际多半不是。它的触发点通常是系统在重置网络栈或者重新加载网络发现模块时,把当前连接掐了。
几个常见的真凶:
网卡的电源管理。设备管理器 → 网络适配器 → 右键网卡 → 属性 → 电源管理 → 取消勾选"允许计算机关闭此设备以节约电源"。无线网卡这一项尤其关键,很多笔记本的无线网卡默认开启省电,网速一慢或者一空闲就掉线。
网络相关的系统服务异常。检查Network List Service、Network Location Awareness、DNS Client这几个服务的状态,异常的话重启一遍。
第三方安全软件的网络防护。有些安全套件的"局域网防护""ARP 防火墙"会拦截 SMB 广播,表现就是网络发现时断时续。临时退出这类软件测一下,能立刻定位。
如果以上都没问题,可以考虑重置网络栈。但要提醒一句,netsh winsock reset和netsh int ip reset会把网络配置一键还原,包括你设的静态 IP、DNS、共享设置,重置完要重新配。所以这是最后的手段,先试前面几项。
netsh winsock reset netsh int ip reset执行完必须重启,重启之后重新设置共享。
7. 一键修复工具与脚本:什么时候能用,什么时候是坑
搜索这些错误码,肯定会看到"打印机共享修复工具""nt6 打印机共享修复工具"之类的推荐。我用了几个,也反编译看过它们做了什么,这里把真相摆出来,你自己判断。
7.1 这类工具到底改了什么
拆开看,所谓"一键修复",做的无非是下面这几件事的组合:
- 把
RpcAuthnLevelPrivacyEnabled改成 0 - 把
AllowInsecureGuestAuth改成 1 - 打开 SMB1 组件
- 打开防火墙的"文件和打印机共享"规则组
- 把 fdPHost、FDResPub 等服务设为自动并启动
- 停掉 spooler,清空 spool 目录,再启动
- 把网络位置改成专用
- 清掉一些打印机相关的残留注册表项
- 补上一些权限(给 Everyone 打印权限)
理解了这个清单,你会发现这些动作你完全可以在十分钟内手动做完,而且心里清楚每一步在干什么。这比用来源不明的工具安全得多。
风险在哪里?这类小工具很多是个人开发的,没有签名,下载站的版本还可能被捆绑过。我见过的情况包括:安装时顺带装浏览器插件、改浏览器主页、静默添加开机启动项、甚至关掉整个防火墙。为了修一个打印机而关掉防火墙,这个代价实在不值。
我的建议是:如果一定要用,只从可信的开发者的原始发布页下载,先在虚拟机或者测试机上跑一遍,看它改了哪些注册表、加了哪些启动项,确认没问题再上生产机器。更好的做法是照着第 7.2 节自己写一个脚本存着,以后每次遇到就双击,改什么一目了然。
7.2 自己写一个可控的一键修复脚本
下面这个批处理脚本涵盖了我日常处理共享失败 90% 的操作,用管理员权限运行即可。它的好处是你知道每一行在做什么,想删哪行就删哪行。
@echo off chcp 65001 echo 正在修复打印机共享环境... echo [1/6] 降低打印 RPC 认证级别(缓解 0x709 / 0x11b) reg add "HKLM\SYSTEM\CurrentControlSet\Control\Print" /v RpcAuthnLevelPrivacyEnabled /t REG_DWORD /d 0 /f echo [2/6] 允许不安全的来宾登录(缓解 0x35 / 0x520) reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v AllowInsecureGuestAuth /t REG_DWORD /d 1 /f echo [3/6] 启用网络发现相关服务 sc config fdPHost start= auto sc config FDResPub start= auto sc config SSDPSRV start= auto net start fdPHost 2>nul net start FDResPub 2>nul net start SSDPSRV 2>nul echo [4/6] 放行文件和打印机共享防火墙规则 netsh advfirewall firewall set rule group="文件和打印机共享" new enable=Yes echo [5/6] 重启打印后台处理程序并清空队列 net stop spooler /y del /Q /F C:\Windows\System32\spool\PRINTERS\* 2>nul net start spooler echo [6/6] 重启 SMB 会话层服务 net stop server /y 2>nul net start server 2>nul echo 修复完成,建议重启一次再测试连接。 pause注意:这个脚本里的第 2 步会放宽来宾登录限制,第 5 步会清空所有人的打印队列(如果主机上有别人正在打的文件,会被清掉)。所以在有同事共用的机器上跑之前,最好挑个没人打文件的时间点,或者把第 5 步的删除命令注释掉。
8. 排查速查表与几条踩坑心得
最后把上面所有内容压缩成一张按现象检索的表,遇到问题直接从现象那一列找。
| 现象 | 最可能的原因 | 先动哪一步 |
|---|---|---|
| 完全搜不到共享打印机 | 网络发现服务没起、SMB1 缺失 | 起 fdPHost/FDResPub,或直接用 UNC |
| 搜得到但连不上,报 0x35 | 防火墙拦 445、共享名是中文 | 放行共享规则,共享名改英文 |
| 报 0x709 | 同名设备残留、RPC 认证高 | 清设备 + RpcAuthnLevelPrivacyEnabled=0 |
| 报 0x11b | 补丁导致的 RPC 认证提升 | 同上,或打修复补丁 |
| 报 06 | spool 卡死、驱动残留 | 清 spool 目录 + 删残留驱动 |
| 报 520 | 凭据会话失效 | 清凭据管理器 + 重启 Workstation |
| 报 40,打一半断掉 | 主机睡眠、无线掉线 | 关睡眠、关网卡省电、固定 IP |
| Linux 有任务不出纸 | 驱动不匹配、双向查询卡住 | 改 raw 验证,关双向支持 |
| 列表获取失败:无效的参数 | 发现类服务异常、网络位置是公用 | 起服务 + 改专用网络 |
| 列表获取失败:重置时断网 | 网卡省电、安全软件拦截 | 关网卡省电,退安全软件测试 |
再说几条从我自己的踩坑经历里总结出来的、文档里不会写的东西。
第一条,先问"是不是只有这一台连不上"。如果全办公室都连不上,问题在主机;只有一台连不上,问题在客户端。这个判断能帮你省掉一半的排查时间。我见过有人客户端折腾了两小时,最后发现是主机换了 IP。
第二条,把"能 ping 通"和"能连 445"分开看。ping 通只代表三层网络没问题,445 不通代表共享通道被拦了,这是两个完全不同的问题域。很多人 ping 通了就认为网络没问题,然后一头扎进驱动里去,方向从一开始就错了。
第三条,改完注册表一定要重启 spooler。注册表项是加载时读取的,改完不重启服务,一点效果都没有。这个细节让我白忙过好几次。
第四条,企业环境别乱动网络发现和来宾。这些开关在家里用没问题,到了有域控、有安全策略的环境,改了可能触发合规告警,甚至被 IT 直接推回。这种情况下正确的做法是走域内的打印服务器方案,用组策略统一推驱动,这才是正路。
第五条,记录下你调通的配置。主机 IP、共享名、用的哪个账户、改了哪几个注册表项,随手记在一个文档里。半年以后系统更新又出问题的时候,照着文档核对一遍,比从零开始快十倍。我现在给每个客户建一个这样的文档,累计下来省的时间相当可观。
顺带说一句,如果你现在的打印机是这几年买的新型号,真的可以认真考虑一下 IPP 或者直接 IP 直连。共享这条路虽然免费,但它的隐性成本是持续存在的:系统一更新就要重新调,跨系统一多就要重新配。我经手的案例里,凡是后来换成带网口直连的,基本都没再找我第二次。