ESC POS PHP库通过SMB协议连接USB共享打印机失败问题
Windows 10 Web服务器无法访问Windows 7共享POS打印机的问题解决
问题场景
我有一台搭载XAMPP的Windows 10 Web服务器,另一台Windows 7客户端电脑连接了POS-58系列热敏打印机并已共享。当从Windows 7访问Web应用时,打印功能无法正常工作;但将两台电脑角色互换(Windows 7作为Web服务器)时,打印完全正常。使用Mike42的ESC-POS库编写的PHP代码如下:
require 'escpos/src/Mike42/Escpos/Printer.php'; require 'escpos/src/Mike42/Escpos/PrintConnectors/PrintConnector.php'; require 'escpos/src/Mike42/Escpos/PrintConnectors/WindowsPrintConnector.php'; require 'escpos/src/Mike42/Escpos/CapabilityProfile.php'; require 'escpos/src/Mike42/Escpos/CodePage.php'; require 'escpos/src/Mike42/Escpos/PrintBuffers/PrintBuffer.php'; require 'escpos/src/Mike42/Escpos/PrintBuffers/EscposPrintBuffer.php'; use Mike42\Escpos\Printer; use Mike42\Escpos\PrintConnectors\WindowsPrintConnector; $connector = new WindowsPrintConnector("smb://Armando-PC/pos1"); // 共享打印机所在的电脑 // 初始化打印机 $printer = new Printer($connector); $printer->text("\n"); $printer->cut(); $printer->close();
问题根源
核心原因是Windows 10上的Apache服务默认运行账户(Local System)没有访问Windows 7共享打印机的权限。Local System账户仅拥有本地系统权限,无法跨设备访问网络共享资源;而Windows 7的系统权限策略相对宽松,或其Apache服务运行账户本身具备跨设备访问权限,因此互换角色后打印正常。
解决步骤
1. 修改Apache服务的运行账户
- 按
Win+R输入services.msc打开「服务」管理器 - 找到XAMPP对应的Apache服务(通常名为
Apache2.4),右键选择「属性」 - 切换到「登录」选项卡,选择「此账户」,输入一个在Windows 7上拥有共享打印机访问权限的账户(优先选择两台电脑共有的域账户,或Windows 7的本地管理员账户)
- 输入该账户的密码,点击「应用」「确定」,重启Apache服务
2. 验证Windows 7共享打印机的权限
- 在Windows 7上右键共享的POS打印机,选择「打印机属性」
- 切换到「安全」选项卡,确认上述Apache运行账户已被授予「打印」权限
- 切换到「共享」选项卡,确认「共享这台打印机」已勾选,且共享名与代码中的
pos1完全一致
3. 调整PHP连接字符串(可选,用于本地账户验证)
如果使用Windows 7本地账户访问共享,可在连接字符串中明确指定账户和密码,避免权限验证失败:
require 'escpos/src/Mike42/Escpos/Printer.php'; require 'escpos/src/Mike42/Escpos/PrintConnectors/PrintConnector.php'; require 'escpos/src/Mike42/Escpos/PrintConnectors/WindowsPrintConnector.php'; require 'escpos/src/Mike42/Escpos/CapabilityProfile.php'; require 'escpos/src/Mike42/Escpos/CodePage.php'; require 'escpos/src/Mike42/Escpos/PrintBuffers/PrintBuffer.php'; require 'escpos/src/Mike42/Escpos/PrintBuffers/EscposPrintBuffer.php'; use Mike42\Escpos\Printer; use Mike42\Escpos\PrintConnectors\WindowsPrintConnector; // 格式:smb://用户名:密码@电脑名称/共享打印机名 $connector = new WindowsPrintConnector("smb://Win7用户名:Win7密码@Armando-PC/pos1"); $printer = new Printer($connector); $printer->text("\n"); $printer->cut(); $printer->close();
额外检查项
- 确保Windows 10和Windows 7处于同一工作组或域中
- 关闭两台电脑的防火墙(或添加Apache服务、SMB协议的允许规则)
- 在Windows 10上手动访问
\\Armando-PC\pos1,确认能正常打开打印机,排除网络或共享本身的问题
内容的提问来源于stack exchange,提问作者Armando Ferrante
相关产品推荐
相关产品推荐

