1

我有一个产生子进程的服务,这些子进程又将打印作业写入 Windows spooler。

这在大多数地方都没有问题,除了在调用时子进程挂起的一台服务器(运行 Server 2008 SP2,其他 2008 SP2 服务器工作正常)上:

PrintDialog.PrintDocument 

或者如果我执行以下操作,它会冻结在 Write 上。

Dim printWriter = PrintQueue.CreateXpsDocumentWriter(printDlg.PrintQueue)
printWriter.Write(paginator, printDlg.PrintTicket)

或使用时

System.Drawing.Printing.PrintDocument.Print

没有作业写入假脱机程序队列。

但是,如果我终止此进程并从命令提示符手动重新启动子进程,则打印正常。

设置为使用相同用户帐户登录的主要服务进程,并且产生的进程也在相同的用户帐户下运行,因此问题似乎是由于进程的启动方式造成的。

我在启动子进程时尝试了以下操作:

Dim psi As New ProcessStartInfo
psi.FileName = exe
psi.Arguments = "ID=" & Id.ToString
psi.UseShellExecute = False
psi.CreateNoWindow = True
psi.Verb = "runas"
psi.RedirectStandardError = True
psi.RedirectStandardOutput = True
psi.LoadUserProfile = True     
ChildProcess = Process.Start(psi)

我还能做些什么来让服务启动的进程以与从 cmd 提示符启动相同的方式运行?

4

1 回答 1

0

一般来说,不可能从服务打印,我希望你的意思是 Windows 服务。原因是 Windows 服务没有桌面 (GDI),因此没有打印机。

因此,尝试从服务打印与从控制台打印完全不同,您作为具有正在运行的 GDI 引擎的桌面的用户打开了控制台。

有一些从服务打印的黑客解决方法,但这是一个痛苦的屁股,微软不推荐!

于 2018-06-26T13:17:36.533 回答