自从 2021 年的 KB5005565 开始,微软就在玩坏 Windows 内置的打印机共享功能的道路上越走越远,虽然知道微软是为了修复 Windows 共享中的漏洞而做出的修改,但你要不要首先确保用户的功能可以继续正常使用?
时至今日,微软的出品质量越来越差,每一次的 Windows Update 都可能引入新的严重 bug,尤其是共享打印机功能,以前通常只需要考虑跨大版本不易解决(如 Win10 去连接 Win7 的共享打印机、XP 去连接 Win11 的打印机等等),而现在甚至同代系统之间都可以昨天还能用、今天就全炸锅了。
前一段时间因各种原因,给某公司组装了几十台办公电脑,由于并非常驻对方公司,无法像在供职公司一样出问题随时上门,在被 Windows 10 优秀的共享打印机功能教训过后(前一天同一个办公室还能用,第二天就全体报错,并且无法重新添加),终于在检索维护方案时,找到一种不需要额外投入成本的方法,即使用 Windows 目前还内置的 LPD 打印服务。
以下操作方式以 Windows 10 为例,Windows 11 操作相近,可自行摸索。
一、安装 LPD 打印服务
在拟用作打印服务器(直连打印机)的电脑上打开“启用或关闭 Windows 功能”,启用“打印和文件服务”下的“LPD 打印服务”(无需勾选“LPR 端口监视器”,但选上也没有什么问题),点击确定安装此功能。
二、启用共享
为接下来要共享的打印机启用共享,此时需要记下共享名,稍后在其他机器添加打印机时会用到。
为达到最佳兼容性,共享名最好遵循以下规则:(1)全小写(录入时比较方便);(2)不要有空格;(3)限制在31个(含)字符内。
三、安装 LPR 打印端口
在打印客户端(其他电脑)上打开“启用或关闭 Windows 功能”,这次启用的是“打印和文件服务”下的“LPR 端口监视器”,点击确定安装此功能。
四、在客户机上添加打印机
(一)在“添加设备”对话框中直接点击“我所需的打印机未列出”,在下一步中选择“通过手动设置添加本地打印机或网络打印机”。
(二)选择“创建新端口”,端口类型选择“LPR Port”。
(三)在“添加 LPR 兼容打印机”对话框中,在“提供 LPD 的服务器的名称或地址”中输入打印服务器的 IP 地址,“服务器上的打印机名称或打印队列名称”中输入第二部中记下的共享名。
(四)在下一步中安装打印机驱动,可去厂商网站下载。
五、额外设置
安装完毕后,打开新增打印机的“打印机属性”,在“端口”中取消勾选“启用双向支持”,否则打印机可能没有反应,对于佳能 CAPT 协议的打印机而言,则可能报错“不支持打印机连接的端口”。
不过该方法也不是万能的,目前有观察到以下两种特殊情况:
一、HP Laserjet 1020 打印机的共享
作为一款经典型号,1020 打印机至今仍在生产新品,迄今已有 20 年的历史,其在官网上提供的“全功能软件和驱动程序”截止至 2016 年,安装程序也有很明显的 XP 年代的痕迹。
但是,如果用官方驱动进行 LPD 共享的话,无论如何无法成功,甚至连 Windows 自带的共享有时也困难重重,表现为可以成功添加打印机,可以成功发送打印任务,但打印机实际上不会有任何反应。
临时解决方案为:去 HP 官网下载官方的通用驱动(HP Universal Print Driver Series for Windows),将已添加的打印机驱动替换为这个通用驱动即可。
此外,如果需要在 macOS 上添加此型号打印机的 LPD 共享连接,驱动程序选择 macOS 自带的 HP Laserjet 1022 即可(HP 官方没有提供 1020 的 macOS 驱动)。
二、LPD 服务报错找不到打印机
出现此错误时,其表象与上一个问题类似,即 LPD 共享可以正常添加,打印任务可以正常下达,但打印机不会有任何反应。
不同的是此时去客户机的事件查看器中,展开 Windows 日志-应用程序,会看到有级别为警告、来源为 Spooler-LPRSVC、事件 ID 为 2004 的记录,内容为:
行式打印机远程工具(LPR)服务无法将打印作业提交到主机(打印服务器 IP 地址)上的 Line Printer Daemon (LPD)打印机(打印机共享名),因为远程主机或打印机上的 LPD 服务正在拒绝打印作业。如果 LPD 服务正在处理其他打印作业则会发生这种情况。LPR 服务将重试打印,直到作业打印成功或用户取消打印作业为止。
在打印服务器上,可以看到级别为错误、来源为 Spooler-LPDSVC、事件 ID 为 4008 的记录,内容为(没有拍照所以为大致内容,来自对英语事件内容的翻译):
行式打印机远程工具(LPR)服务拒绝了来自(打印服务器 IP 地址)提供给(打印机共享名)的打印任务,因为指定的打印机不存在。请从客户端以正确的打印机名称重新发起打印任务。
此问题即便在客户机上添加 LPD 打印机时填写的共享名完全正确也可能发生(添加打印机时只校验服务是否可以连接,并不校验打印队列名称是否正确,所以请优先检查共享名称是否录入有误),临时解决方法为在服务器上给打印机换一个共享名,然后在客户机上重新添加 LPD 打印机,但也可能无效,具体原因仍有待探究。
2018年做存储的时候,经历过:
Win7-Linux Samba,通;
Linux-Linux Samba,通;
Win7-Win7 SMB/CIFS(没错,这玩意应该叫SMB/CIFS,Samba只是Linux上为了连SMB/CIFS的一个服务端+客户端的名字),死活不通,看不到主机,看不到共享文件夹,GUEST没权限,用户名没权限,然后重启主机/客机就好使,然后重启主机/客机又坏了。
就更别说 XP Win7 Win10之间的恩爱情仇了。
好在大部分Mac/iPhone的用户都是傻子,完全不知道Mac/iPhone还能连SMB/CIFS,不然大坑更多。
至于打印机,真的是新天坑。依赖SMB本身就不靠谱(除非服务端是一台跑着Samba的Linux但是大部分公司插打印机的都是Windows),LPD要安装驱动这事情对于一般用户上来就骂“我是Windows是免驱的”,然后驱动大概率不好使,用户再推开你说啥也不懂然后又在那抠网络共享,最后要不就是把打印机薅下来插他自己电脑上,要不就是拿个U盘跑去打印机电脑上打印。
尤其是文章最后给打印机换名就能用的问题,我还真遇到过。
我也已经无话可说了,偏偏在办公环境下打印机共享还是一个硬需求,而且还要面对各种各样奇怪的软硬件条件。
就比如之前我提到过的航天信息税控打印机,那个开票软件就只认本地打印机,对于 Windows 共享打印机直接装作没看见,当时如果我就了解到 LPD 打印共享就不用买硬件的共享器了,不过硬件共享器比起用一台 PC 共享耗电更低,且超级稳定,也算没白花钱。
Samba 确实是 Windows 共享的 Linux 实现的名字,写的时候忘记了这一点,已对提及的位置进行修改,感谢指出。