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

Python调用win32print打印机时遇Access Denied错误求助

打印机自动化代码优化与权限问题解决

权限错误原因

你的核心问题是权限不足:

  • 修改打印机设置(包括设为默认)需要管理员权限,普通用户权限无法完成这些操作。
  • PRINTER_ALL_ACCESS/PRINTER_ACCESS_ADMINISTER需要管理员权限,普通用户打开打印机时会被拒绝;PRINTER_ACCESS_USE仅能使用打印机,无法执行修改类操作(比如SetPrinter或设默认)。

代码优化建议

1. 移除冗余操作

你当前代码中调用SetPrinter但未修改任何打印机属性,这一步完全多余,直接删除即可。

2. 权限适配方案

方案一:以管理员身份运行脚本

这是最直接的解决方式,右键点击Python脚本或终端,选择「以管理员身份运行」,此时可以使用PRINTER_ACCESS_ADMINISTER权限完成设置默认打印机的操作。

优化后的代码:

import win32api
import win32print

def set_default_printer_and_print(printer_name, file_path):
    # 以管理员权限打开打印机
    printdefaults = {"DesiredAccess": win32print.PRINTER_ACCESS_ADMINISTER}
    try:
        handle = win32print.OpenPrinter(printer_name, printdefaults)
        # 设置默认打印机
        win32print.SetDefaultPrinter(printer_name)
        # 打印文件
        win32api.ShellExecute(0, 'print', file_path, None, '.', 0)
    except Exception as e:
        print(f"操作失败: {e}")
    finally:
        # 确保关闭打印机句柄
        if 'handle' in locals():
            win32print.ClosePrinter(handle)

if __name__ == "__main__":
    PRINTER_NAME = "Microsoft Print to PDF"
    TARGET_FILE = "test.pdf"
    set_default_printer_and_print(PRINTER_NAME, TARGET_FILE)

方案二:避免修改默认打印机(仅打印)

如果不需要设置默认打印机,仅需打印文件,可使用普通权限,代码简化为:

import win32api

def print_file(file_path):
    # 直接调用打印,系统会使用当前默认打印机
    win32api.ShellExecute(0, 'print', file_path, None, '.', 0)

print_file("test.pdf")

额外注意事项

  • 确保test.pdf文件路径正确,脚本运行目录下存在该文件,或传入完整绝对路径。
  • Microsoft Print to PDF打印机名称需与系统中显示的完全一致,可通过win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, 1)枚举本地打印机确认名称。

内容的提问来源于stack exchange,提问作者RandomPen123ASDA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:05:05