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
相关产品推荐
相关产品推荐

