Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Windows服务打印EMF_C#_.net 3.5_Printing_Windows Services_System.printing - Fatal编程技术网

C# 从Windows服务打印EMF

C# 从Windows服务打印EMF,c#,.net-3.5,printing,windows-services,system.printing,C#,.net 3.5,Printing,Windows Services,System.printing,我有一些使用System.Drawing.Printing命名空间打印文档的代码。现在需要将其移动到windows服务中。声明这是不可能的,这将支持我到目前为止的发现,因为它不起作用。我的工作假设我可以通过使用System.Printing命名空间来实现这一点 以下是我目前掌握的代码: private Metafile myDoc; myDoc = GetEmfDoc(); PrintServer ps = new PrintServer("\\server1\printer1"); Enu

我有一些使用System.Drawing.Printing命名空间打印文档的代码。现在需要将其移动到windows服务中。声明这是不可能的,这将支持我到目前为止的发现,因为它不起作用。我的工作假设我可以通过使用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", ?);
所以我想把我的doc传递给pq.AddJob,但这似乎是不可能的。使用System.Drawing.Printing,可以简单地在PrintDocument.PrintPage事件中逐页呈现


我想做的是可能的吗?如果可能的话,有人能给我指出正确的方向吗?

您是否在拥有使用打印机所需权限的帐户中运行您的服务?有关详细信息,请参阅。

您是否在拥有使用打印机所需权限的帐户中运行服务?更多详细信息请参见。

这是权限问题和会话0隔离的组合

尽管我不建议您使用以下方法,但它可能会解决您面临的问题:


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

这是权限问题和会话0隔离的组合

尽管我不建议您使用以下方法,但它可能会解决您面临的问题:

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

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

理解“不支持”在这种情况下的含义很重要。它的字面意思是它所说的,如果您试图从服务打印并发现问题,那么您就不能致电Microsoft支持部门寻求帮助

这不是由系统绘图引起的问题,而是打印机驱动程序的一般问题。由打印机制造商而不是Microsoft提供的代码块。它们的一个重要问题是,它们总是被设计为从桌面程序使用。单词,杂技演员,等等。他们很容易利用这一点,他们经常弹出一个窗口,让你知道他们正在做这件事。一点也不想垃圾邮件的制造商名称,并提醒您,碳粉盒是半空的。这些司机很可能在服务中行为不端。注释中提到的运行时异常短语

最糟糕的问题是,他们使用弹出窗口让你知道有问题。从服务中使用打印机驱动程序时,这些窗口不可见。因此,您必须处理无明显原因拒绝打印的打印作业。注释中的服务性能下降短语。这是很难处理的,当IT人员看不到任何诊断信息时,他们无法尝试解决问题

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

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

理解“不支持”在这种情况下的含义很重要。它的字面意思是它所说的,如果您试图从服务打印并发现问题,那么您就不能致电Microsoft支持部门寻求帮助

这不是一个容易引起争议的问题 这是打印机驱动程序的一个常见问题。由打印机制造商而不是Microsoft提供的代码块。它们的一个重要问题是,它们总是被设计为从桌面程序使用。单词,杂技演员,等等。他们很容易利用这一点,他们经常弹出一个窗口,让你知道他们正在做这件事。一点也不想垃圾邮件的制造商名称,并提醒您,碳粉盒是半空的。这些司机很可能在服务中行为不端。注释中提到的运行时异常短语

最糟糕的问题是,他们使用弹出窗口让你知道有问题。从服务中使用打印机驱动程序时,这些窗口不可见。因此,您必须处理无明显原因拒绝打印的打印作业。注释中的服务性能下降短语。这是很难处理的,当IT人员看不到任何诊断信息时,他们无法尝试解决问题



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

该服务是以管理员用户的身份运行的,因此我相信这不是权限问题。@pmu 2我非常相信以管理员的身份运行本身并不能解决会话0问题…该服务是以管理员用户的身份运行的,因此,我确信这不是权限问题。@pm_2我非常确信单独以管理员身份运行不会解决会话0问题……您是否尝试将服务配置为以本地系统帐户登录并选中“允许服务与桌面交互”框?到目前为止,这是我找到的最接近的解决方案。如果设置了此标志,并且未调用PrintSettings.IsValid,则使用System.Drawing.Printing.PrintDocument有效。是否尝试将服务配置为以本地系统帐户登录并选中“允许服务与桌面交互”框?到目前为止,这是我找到的最接近解决方案。如果设置了此标志,并且未调用PrintSettings.IsValid,则使用System.Drawing.Printing.PrintDocument有效。所涉及的服务器是Windows server2003@pm_2谢谢你提供的信息,但我似乎不明白这些信息会告诉我关于你所描述的问题。。。也许您可以详细说明一下……我知道会话0隔离不适用于Win Svr2003@pm_2IIRC根据service pack/bitness等,这并不完全正确。@pm_2另一点是其余问题仍然存在,即您需要在您的Windows服务正在运行的会话中建立一个已通过身份验证的连接有问题的服务器是Windows server2003@pm_2谢谢你提供的信息,但我似乎不明白这些信息会告诉我关于你所描述的问题。。。也许您可以详细说明一下……我知道会话0隔离不适用于Win Svr2003@pm_2IIRC根据service pack/bitness等,这并不完全正确。@pm_2另一点是,其余问题仍然存在,即您需要在Windows服务运行的会话中建立一个已验证的连接。。。