如何使用 python & win32print 更改打印队列中作业的用户名

How to change username of job in print queue using python & win32print

我正在尝试更改队列中打印作业的用户,因为我想在服务帐户上创建它,但将作业发送给另一个用户跟随我打印队列。我在 python 中使用 win32 模块。这是我的代码示例:

from win32 import win32print

JOB_INFO_LEVEL = 2
pclExample = open("sample.pcl")
printer_name = win32print.GetDefaultPrinter()
hPrinter = win32print.OpenPrinter(printer_name)

try:
    jobID = win32print.StartDocPrinter(hPrinter, 1, ("PCL Data test", None, "RAW"))
    # Here we try to change the user by extracting the job and then setting it again
    jobInfoDict = win32print.GetJob(hPrinter, jobID , JOB_INFO_LEVEL )
    jobInfoDict["pUserName"] = "exampleUser"
    win32print.SetJob(hPrinter, jobID , JOB_INFO_LEVEL  , jobInfoDict , win32print.JOB_CONTROL_RESUME )

    try:
        win32print.StartPagePrinter(hPrinter)
        win32print.WritePrinter(hPrinter, pclExample)
        win32print.EndPagePrinter(hPrinter)

    finally:
        win32print.EndDocPrinter(hPrinter)
finally:
    win32print.ClosePrinter(hPrinter)
    

问题是我在 win32print.SetJob() 行遇到错误。如果 JOB_INFO_LEVEL 设置为 1,则会出现以下错误:

(1804, 'SetJob', 'The specified datatype is invalid.')

这是一个与 C++ 在后台工作方式有关的已知错误 (Issue here)。

如果 JOB_INFO_LEVEL 设置为 2,则会出现以下错误:

(1798, 'SetJob', 'The print processor is unknown.')

但是,这是来自 win32print.GetJob() 的处理器。在不尝试更改用户的情况下,打印效果很好,所以我不确定哪里出了问题。

如有任何帮助,我们将不胜感激! :)

编辑:

使用 Python 3.8.5 和 Pywin32 303

一开始我以为是个误会(我对bug报告也有点怀疑),主要是因为下面这段话(显然好像是错的 ) 来自 [MS.Docs]: SetJob function强调 是我的):

The following members of a JOB_INFO_1, JOB_INFO_2, or JOB_INFO_4 structure are ignored on a call to SetJob: JobId, pPrinterName, pMachineName, pUserName, pDrivername, Size, Submitted, Time, and TotalPages.

但我做了一些测试并 运行 解决了这个问题。问题如错误中所述:使用 填充 JOB_INFO_* 字符串成员(即 LPTSTRs) char* 数据.

已提交 [GitHub]: mhammond/pywin32 - Fix: win32print.SetJob sending ANSI to UNICODE API(弹出 2 个错误中的 none)。它已于 220331.

合并到 main

测试修复时,我能够更改现有作业的各种属性,令我惊讶的是它不必是有效数据(如下所示),我有点好奇当作业执行时会发生什么(因为现在我没有连接到打印机):

  • pUserName 更改为 str(random.randint(0, 10000)) 以确保它在每个脚本 运行 (PrintScreens 单独拍摄并组装在 Paint):

更进一步的方法:

  1. 等待发布新的 PyWin32 版本(包含此修复程序)。 这是推荐的方法,但也需要更多时间(具体何时发生还不清楚)

  2. 获取来源,或者:

  • 来自 main

  • 来自 b303(最后稳定版 b运行ch),并应用(上述)补丁(1)

    构建模块 (.pyd) 并将其复制到 PyWin32site-packages 您的 Python 安装目录。更快,但需要更深入的知识,维护可能会成为一场噩梦



脚注

  • #1:检查修补ut运行ner 部分)了解如何应用补丁(在 Win 上)。