.net 如何在已订购的一批打印作业期间锁定打印机访问权限

.net 如何在已订购的一批打印作业期间锁定打印机访问权限,.net,printing,c#-4.0,.net,Printing,C# 4.0,是否有一种方法可以在打印大批量文档之前以编程方式锁定网络打印设备,并在打印后将其释放?我们主要使用C#、VS2010、.NET4.0框架 我们公司有许多涉及大量印刷的既定流程。其中许多涉及到以编程方式重复打印特定的小文档,每次使用不同的参数。结果是一大批数百页的页面需要整理 不幸的是,由于批处理是作为一系列小作业而不是单个大作业发送到打印机的,因此如果另一个用户同时在同一台打印机上打印,他们的作业可能会在大批量的页面之间结束,从而打乱大批量的顺序,导致大海捞针,让打印大批量的用户感到沮丧 显然,

是否有一种方法可以在打印大批量文档之前以编程方式锁定网络打印设备,并在打印后将其释放?我们主要使用C#、VS2010、.NET4.0框架

我们公司有许多涉及大量印刷的既定流程。其中许多涉及到以编程方式重复打印特定的小文档,每次使用不同的参数。结果是一大批数百页的页面需要整理

不幸的是,由于批处理是作为一系列小作业而不是单个大作业发送到打印机的,因此如果另一个用户同时在同一台打印机上打印,他们的作业可能会在大批量的页面之间结束,从而打乱大批量的顺序,导致大海捞针,让打印大批量的用户感到沮丧

显然,这在我们公司催生了一种文化,在这种文化中,每次用户要打印时,他们都会向整个公司发送一封群发电子邮件,说“我正在用某个打印机打印,我将使用它大约一个小时,请不要用它打印,我完成后会再次发送电子邮件。”


我希望能够通过编程锁定打印机,提交一批订购的打印作业,然后释放打印机。理想情况下,作业仍然可以提交给打印机,但它们必须排队等待,直到大批量完成并释放打印机。不幸的是,在过去,我们在实现这一目标方面没有取得太大成功。是否有其他人使用.NET解决了类似的问题?

挫败了WithForms设计者的想法,如果打印机的所有客户端都是Windows机器,那么包装Windows打印驱动程序就可以了。如果您有Mac、Linux机箱或其他设备也连接到打印机,则需要为这些系统中的每一个实现类似的包装器

听起来您需要一个应用程序,可以将这些作业中的每一个批处理为单个打印作业

一些公司生产免费的PDF打印驱动程序。我以前用过这个,很成功


然后,您可以使用类似C#库的方法将生成的PDF合并到单个大文档中,该文档将作为单个作业打印。

打印机,或者更确切地说,打印机队列,在Windows中具有ACL。更改ACL以便只有一个用户具有打印权限应该是可能的

这意味着授予每个人对打印机的更改权限(并确保您从其他所有人中删除该权限,以白色打印处理批处理)

我还建议进行某种重置(可能按计划),以防批处理打印机以某种方式出现故障,从而无法恢复权限

这将需要p/Invoke

  • 使用级别3调用,实例将获得当前安全描述符
  • 使用替换ACL更新被
    打印机\u INFO\u 2.pSecurityDescriptor
    引用的ACL(并保留原始ACL)
  • 使用更新的
    打印机信息\u 2
    呼叫
  • 重复此过程,使用保存的ACL进行恢复。我假设这需要在队列中主机所在的服务器上执行


    (使用某种方法将所有内容作为单个文档发送可能会更容易,并避免每个人都可以更改队列的权限。)

    解决方案1:如果您编写或有权访问提交作业的代码 这将有效地创建一个大作业,并将它们保持在一起,即使作业是从其他工作站和服务器提交的

    在这种情况下,您可以提交多个作业,并在后台处理程序API中使用结构调用函数以将一个作业链接到下一个作业

    在调用EndJob完成假脱机之前,必须链接所有作业

    有关详细信息,请参见备注部分

    解决方案2:更改优先级 如果此服务器\工作站是提交给打印机的唯一来源,则这将使作业保持在一起


    假设您是按顺序提交作业,则可以使用具有结构的函数设置优先级,并提高优先级。您需要先调用以填充作业信息结构,更改优先级,然后调用SetJob。

    这可能取决于打印机驱动程序。如果您拥有的驱动程序不支持此功能,那么您可以为其编写一个包装器,这基本上只是添加了锁定功能。然后让程序触发自定义驱动程序包装中的锁。或者可以研究某种打印服务器系统……这似乎是一种更简单的方法,尽管我希望原始的页码可以保留在许多较小的文档中。谢谢,SetJob()的提示挽救了我的生命,我不知道这个功能。