【问题标题】:Windows, Block a process from PrintingWindows,阻止打印进程
【发布时间】:2011-03-11 20:22:51
【问题描述】:

Windows 进程有什么方法可以阻止另一个进程打印吗?

基本上,我们正在努力削减办公室的成本,并且我们希望阻止人们打印他们的电子邮件。所以有人问我是否可以编写一个程序来阻止或取消来自 Outlook 的任何打印作业。

可以使用任何语言或 API 的解决方案,只要可行。

我们有 Win XP 和 Win 7 用户。

【问题讨论】:

  • 我怀疑这会有多大帮助。如果您确实成功阻止了来自 Outlook 的打印作业,人们只会将他们的电子邮件保存到另一个文件并打印。

标签: windows printing


【解决方案1】:

确实没有在 Windows 上执行此操作的好方法。

此外,这似乎不是技术问题。

每月仅向打印机供应一令纸。让大家知道纸张供应有限。

显而易见的解决方法是用户将自己带入纸张,但这将大大降低运营成本,所以这不是一个真正的问题。

【讨论】:

    【解决方案2】:

    您使用的是网络打印机吗?如果是这样,您可以简单地审核打印机的日志(或打印服务器的)并相应地“教育”您的用户,它将为您省去编写此类程序并将其部署在每台 PC 上的麻烦(并确保没有用户可以覆盖它)。

    【讨论】:

    • 没错,但我们已经尝试教育人们节约纸张。简而言之,有些人就是不在乎。此外,审查审计日志听起来像是 IT 需要做的大量额外工作。另外,既然问了这个问题,我想看看答案。称之为学术好奇心。
    • 那么如果您使用的是打印机服务器,您可以尝试找出您的打印机驱动程序是否有某种 ACL。如果没有这样的事情,那么您将无法实现黑客攻击。
    【解决方案3】:

    基本上,这是我能找到的最接近的方法。如果基本上等待打印作业显示特定作业名称,然后取消该作业。

    但从技术上讲,我认为我的问题的答案是否定的,因为我问我是否可以通过流程来做到这一点。虽然下面很接近。它只是打印出正在发生的作业并取消任何在其标题中显示 MS Outlook 的打印作业。字典只是防止它多次列出相同的工作。

    Imports System.Printing    
    Module Module1
    Sub Main()
    
        Using ps As New PrintServer("\\server")
    
            Using Pq = ps.GetPrintQueue("printer")
    
                Dim DetectedJobs As New Dictionary(Of DateTime, String)
                Do
                    Dim Pj = Pq.GetPrintJobInfoCollection
                    For Each job In Pj
                        If Not (DetectedJobs.ContainsKey(job.TimeJobSubmitted) AndAlso DetectedJobs(job.TimeJobSubmitted) = job.Name) Then
                            DetectedJobs.Add(job.TimeJobSubmitted, job.Name)
                            Console.WriteLine(job.Name & "," & job.JobIdentifier & "," & job.TimeJobSubmitted)
                        End If
                        If job.Name.Contains("Microsoft Office Outlook") Then
                            job.Cancel()
                            Console.WriteLine(job.Name & "," & job.JobIdentifier & "," & job.TimeJobSubmitted & " - Cancelled")
                        End If
                        job.Dispose()
                    Next
                    Pj.Dispose()
    
                    Threading.Thread.Sleep("200")
                Loop
    
            End Using
        End Using
    
        Console.ReadKey()
    
    End Sub
    
    End Module
    

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2019-06-14
      • 2015-05-05
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2018-08-05
      相关资源
      最近更新 更多