【问题标题】:Printing EMF from a Windows service从 Windows 服务打印 EMF
【发布时间】:2012-04-11 13:22:50
【问题描述】:

我有一些使用System.Drawing.Printing 命名空间打印文档的代码。现在需要将其移动到 Windows 服务中。 The documentation 表示这是不可能的,这将支持我迄今为止的发现(因为它不起作用)。我假设我可以通过使用 System.Printing 命名空间来实现它。

这是我目前的代码:

private Metafile myDoc;

myDoc = GetEmfDoc();

PrintServer ps = new PrintServer("\\server1\printer1");
EnumeratedPrintQueueTypes[] flags = { EnumeratedPrintQueueTypes.Local };
PrintQueueCollection queues = ps.GetPrintQueues(flags);

PrintQueue pq = queues.First<PrintQueue>();                
pq.AddJob("JobName", ?);

所以我想将myDoc 传递给pq.AddJob(),但这似乎是不可能的。使用System.Drawing.Printing 可以在PrintDocument.PrintPage 事件中简单地逐页呈现。

我正在尝试做的事情是否可行,如果可以,有人能指出我正确的方向吗?

【问题讨论】:

  • 您是否尝试将服务配置为以“本地系统帐户”登录+选中“允许服务与桌面交互”框?
  • 到目前为止,这是我最接近的解决方案。如果设置了此标志,则使用 System.Drawing.Printing.PrintDocument 有效,并且不调用 PrintSettings.IsValid。

标签: c# .net-3.5 printing windows-services system.printing


【解决方案1】:

System.Drawing.Printing 命名空间中的类不支持在 Windows 服务或 ASP.NET 应用程序或服务中使用。尝试在其中一种应用程序类型中使用这些类可能会产生意想不到的问题,例如服务性能下降和运行时异常。

在这种情况下,了解“不支持”的含义很重要。它的字面意思是它所说的,如果您尝试从服务打印并发现问题然后您无法致电 Microsoft 支持并寻求帮助。

不是 System.Drawing 引起的问题,它是打印机驱动程序 的一般问题。由打印机制造商而非 Microsoft 提供的代码块。它们的一个重要问题是它们总是被设计为从桌面程序中使用。 Word、Acrobat 等等。他们很容易利用这一点,他们经常弹出一个窗口让你知道他们正在努力。至少不要向制造商发送垃圾邮件并提醒您碳粉盒是半空的。这些驱动程序可能在服务中行为不端。注释中提到的“运行时异常”短语。

他们最糟糕的问题是他们使用弹出窗口让您知道存在问题。当您使用服务中的打印机驱动程序时,这些窗口不可见。因此,您将不得不处理无缘无故拒绝打印的打印作业。注释中的“服务性能下降”短语。这很难处理,当 IT 人员看不到任何诊断时,他们无能为力解决问题。

您的方法并不能解决这个根本问题。如果您真的想这样做,请联系打印机制造商并寻求具体建议。不要抱太大希望,从硬件公司那里得到好的答案是相当困难的。

【讨论】:

    【解决方案2】:

    这是权限问题和 Session 0 隔离的组合...

    虽然我不推荐,但以下可能会解决您面临的问题:

    如果您真的想要/需要完成这项工作,您将需要从会话 0 内部(不是从“正常”用户会话)登录(事先!)到远程服务器(在您的示例中为 server1) - 以交互方式(您可以通过rundll32 winsta.dll,WinStationSwitchToServicesSession 切换到会话 0 桌面)或通过一些调用(例如使用WNetAddConnection2 和远程机器的正确凭据,不幸的是,这只能通过 p/invoke 或从 .NET 使用COM 使用WScript.Network)。用于此登录的凭据需要具有在远程计算机上打印的完全权限。

    【讨论】:

    • 有问题的服务器是 Windows Server 2003
    • @pm_2 感谢您提供的信息,但我似乎不明白这些信息将告诉我关于您描述的问题的什么...也许您可以详细说明...
    • 我知道会话 0 隔离不适用于 Win Svr 2003
    • @pm_2 IIRC 这并不完全正确(取决于服务包/位数等)
    • @pm_2 另一点是其余问题仍然存在(即,您需要在运行 Windows 服务的会话中拥有已经过身份验证的连接)...
    【解决方案3】:

    您是否在具有使用打印机的必要权限的帐户中运行您的服务?更多详情请关注Windows Services FAQ

    【讨论】:

    • 该服务以管理员用户身份运行,所以我确信这不是权限问题。
    • @pm_2 我非常有信心以管理员身份运行本身不会解决会话 0 的问题...
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多