使用PrintQueueWatch库PrintJob.Transfer函数时遭遇访问拒绝问题
解决PrintQueueWatch中PrintJob.Transfer访问拒绝(Access Denied)错误
出现访问拒绝错误,通常是权限不足或打印作业/打印机的权限配置问题,以下是针对性的解决步骤:
1. 确保程序以管理员权限运行
PRINTER_ALL_ACCESS权限需要较高的系统权限,普通用户权限可能无法完全获取。右键启动程序时选择以管理员身份运行,测试是否能正常执行转移操作。如果有效,可在项目属性中设置强制管理员权限:右键项目→属性→安全性→启用ClickOnce安全设置→编辑权限→选择“完全信任应用程序”,或直接在app.manifest中修改requestedExecutionLevel为requireAdministrator。
2. 调整打印机的权限设置
源打印机(HP LaserJet P1006)
打开控制面板→设备和打印机,右键目标打印机选择打印机属性,切换到安全选项卡:
- 确保当前用户或所属用户组拥有管理文档和打印权限
- 若权限缺失,点击编辑添加用户,勾选对应权限后保存
目标打印机(Microsoft Print to PDF)
同样检查目标打印机的安全设置,当前用户需要至少拥有打印权限,建议同时授予管理文档权限,避免转移操作时权限不足。
3. 验证打印作业的所有权
如果打印作业不是当前用户创建的,即使拥有打印机权限也无法转移:
- 打开打印机队列,查看目标作业的所有者信息
- 若所有者不是当前用户,可在打印机安全设置中给当前用户授予管理文档权限,允许修改其他用户的作业
4. 优化代码中的权限与实例复用
你的代码中重复创建了两次PrinterInformation实例,属于冗余操作。同时可尝试拆分权限组合(PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE)替代PRINTER_ALL_ACCESS,避免请求不必要的权限导致系统拒绝:
using (var sourcePrinter = new PrinterQueueWatch.PrinterInformation( "HP LaserJet P1006", PrinterQueueWatch.SpoolerApiConstantEnumerations.PrinterAccessRights.PRINTER_ACCESS_ADMINISTER | PrinterQueueWatch.SpoolerApiConstantEnumerations.PrinterAccessRights.PRINTER_ACCESS_USE, true)) { var printJob = sourcePrinter.PrintJobs.get_ItemByJobId(Id); printJob.Transfer("Microsoft Print to PDF", false); }
5. 临时排查UAC限制
如果以上方法无效,可暂时降低UAC级别(控制面板→用户账户→更改用户账户控制设置)到最低档测试。若解决问题则说明是UAC拦截了权限请求,测试后建议改回UAC设置,通过管理员权限运行程序来解决。
内容的提问来源于stack exchange,提问作者user26635770
相关产品推荐
相关产品推荐

