You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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. 验证打印作业的所有权

如果打印作业不是当前用户创建的,即使拥有打印机权限也无法转移:

  1. 打开打印机队列,查看目标作业的所有者信息
  2. 若所有者不是当前用户,可在打印机安全设置中给当前用户授予管理文档权限,允许修改其他用户的作业

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:40:01