我正在构建一个需要使用PrintDocument方法进行打印的ASP.NET应用程序:
PrintDocument.Print()
使用IIS Express在开发环境中正常打印。将其发布到Intranet IIS服务器时,打印失败,我认为这是由aspnet工作进程的权限问题引起的。
我尝试执行以下操作但没有成功:
<identity impersonate="true" username="username" password="*****"/>
<validation validateIntegratedModeConfiguration="false"/>
添加到<system.webServer>
部分。< / LI>
请帮忙吗?
答案 0 :(得分:5)
我认为你可能会误解一些基本概念。使用PrintDocument.Print()
时,您正在服务器上打印。在IIS中部署应用程序时,此打印将在托管应用程序的服务器计算机上进行。您认为您的代码在IIS Express中正常工作的原因是因为您在与测试它的客户端浏览器相同的计算机上托管您的应用程序。您还在您的帐户下运行了已配置打印机的应用程序。
您无法从Web应用程序直接打印到客户端计算机。这将是一个很大的安全问题。您可以做的最好的事情是使用打印media CSS type
提供一些HTML文档。然后,如果用户决定,他可以在浏览器中打印它。
另一方面,如果要在连接到Web服务器的某台打印机上进行打印,则需要在IIS中配置应用程序池,以便在其配置文件中配置了打印机的标识下运行。
答案 1 :(得分:0)
我认为原始海报对他们的问题有很多不妥。例如,如果要使用GhostScript生成.PDF,则需要安装打印机驱动程序并为其创建打印机。您可以通过提前提供一个语言来抑制多种语言的Saveas()对话框。这在早期版本的IIS中可行(可能不太安全),但在IIS 8中更难做到。
我认为此问题是由IIS禁止访问本地打印机队列引起的。这可能是由于在运行时不在NT AUTHORITY \ INTERACTIVE组中引起的,或者是因为IIS会将用户(任何运行应用程序池的人)分为两组:IIS APPPOOL \和BUILTIN \ IIS_IUSRS。
您可以使用Sys Internal的Process Explorer等工具查看线程权限来验证所有这些。
答案 2 :(得分:0)
希望我能正确理解你的问题,但我自己也对此感到困惑。我的工作设置是带有IIS 7的Windows Server 2008 R2。
我们在同一个盒子上安装了一个打印服务器(不确定是否重要,因为这不是我的专家领域)。
基本上,使用PrinterSettings.InstalledPrinters
查看已安装的打印机,我能够看到服务器上安装的所有打印机名称。
我将一个调试器附加到应用程序进程进行调试,我可以使用调试器来查看这个,否则你将需要运行一个循环来打印这些。如果在本地运行,则只能看到计算机上安装的打印机。如果它们是网络打印机,则将显示完整路径。因此,确定服务器将识别打印机的路径/名称,然后使用
将其明确设置为打印机名称 PrintDocument类的 PrinterSettings.PrinterName
属性。这对我有用。此外,我的应用程序池标识设置为NetworkService
。
答案 3 :(得分:0)
我遇到了同样的问题,我找到了以下解决方案,它对我有用。
1 - Go to printer and setting of system
2 - Select Printer
3 - Go to Printer Properties
4 - Security
5 - Click on Add "IIS AppPool\DefaultAppPool" as object name and click on check name (Default Pool will be your Pool Name)
6 - Give permission Manage This Printer and Manage Document permission.
7 - Restart IIS