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

Time:04-01

I am trying to change the user of a print job in the queue, as I want to create it on a service account but send the job to another users follow-me printing queue. I'm using the win32 module in python. Here is an example of my code:

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)
    

The problem is I get an error at the win32print.SetJob() line. If JOB_INFO_LEVEL is set to 1, then I get the following error:

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

This is a known bug to do with how the C works in the background (img0

Ways to go further:

  1. Wait for a new PyWin32 version (containing this fix) to be released. This is the recommended approach, but it will also take more time (and it's unclear when it will happen)

  2. Get the sources, either:

  • from main

  • from b303 (last stable branch), and apply the (above) patch(1)

    build the module (.pyd) and copy it in the PyWin32's site-packages directory on your Python installation(s). Faster, but it requires some deeper knowledge, and maintenance might become a nightmare



Footnotes

  • Related