ASP.NET IIS 服务器端打印失败

Posted

技术标签:

【中文标题】ASP.NET IIS 服务器端打印失败【英文标题】:ASP.NET IIS server side printing fails 【发布时间】:2014-01-19 03:43:39 【问题描述】:

我正在构建一个需要使用 PrintDocument 方法打印的 ASP.NET 应用程序:

PrintDocument.Print()

打印在使用 IIS express 的开发环境中正常工作。发布到内网IIS服务器时打印失败,我认为是aspnet工作进程权限问题造成的。

我尝试执行以下操作但没有成功:

我在集成管道模式下为管理员本地用户创建了一个应用程序池,其中 load user profile 选项设置为 true 我将应用程序移到了新创建的应用程序池中 我在 web.config 文件中添加了<identity impersonate="true" username="username" password="*****"/> 出现错误,指出:检测到不适用于集成托管管道模式的 ASP.NET 设置,因此我将 <validation validateIntegratedModeConfiguration="false"/> 添加到 <system.webServer> 部分。

有什么帮助吗?

【问题讨论】:

请不要以本地管理员身份运行 Web 应用程序,一旦该框被 pwned,这对您和其他所有人的安全都非常不利。 您可以直接从 RDLC 转到 PDF:RDLC - Export directly to Excel or PDF from codebehind. 【参考方案1】:

我认为您可能在这里误解了一些基本概念。当您使用PrintDocument.Print() 时,您正在服务器上打印。当您在 IIS 中部署应用程序时,此打印将发生在托管应用程序的服务器计算机上。您认为您的代码在 IIS Express 中工作的原因是因为您将应用程序托管在与测试它的客户端浏览器相同的计算机上。此外,您在配置了打印机的帐户下运行应用程序。

您无法从 Web 应用程序直接打印到客户端计算机。那将是一个很大的安全问题。您可以做的最好的事情是使用打印media CSS type 提供一些html 文档。然后,如果用户决定,他可能会在浏览器中打印。

另一方面,如果您想在连接到 Web 服务器的某些打印机上打印,则需要在 IIS 中配置应用程序池,以在其配置文件中配置了打印机的身份下运行。

【讨论】:

当然,我正在尝试打印到服务器中配置的打印机,而不是本地客户端打印机。我尝试按照您所说的配置应用程序池,但失败了。那么,我该怎么做呢? 是的,在这种情况下,您应该将 IIS 中的应用程序池配置为在配置了打印机的帐户下运行。并且您已在此应用程序池的属性中启用加载用户配置文件。 我为本地管理员帐户创建了一个应用程序池,并且启用了加载用户配置文件 (=true),但它不起作用。 本地管理员账户是否配置了打印机? 当然什么都不会出现:-) 它不会出现。你期望它出现在哪里?没有与 IIS 关联的 UI。这应该适用于普通打印机。【参考方案2】:

希望我正确理解了您的问题,但我自己对此有些困惑。我们在工作中的设置是带有 IIS 7 的 Windows Server 2008 R2。

我们在同一个盒子上也安装了一个打印服务器(不确定这是否重要,因为这不是我的专家领域)。

基本上,使用PrinterSettings.InstalledPrinters 查看已安装的打印机我能够看到服务器上安装的所有打印机名称。

我将调试器附加到应用程序进程以进行调试,我可以使用调试器查看此内容,否则您将不得不运行一个循环来打印这些内容。如果您在本地运行此程序,您将只能看到安装在您机器上的打印机。如果它们是网络打印机,则将显示完整路径。因此,确定服务器将识别打印机的路径/名称,然后使用显式将其设置为打印机名称,

PrinterSettings.PrinterName PrintDocument 类的属性。这对我有用。此外,我的应用程序池标识设置为NetworkService

【讨论】:

【参考方案3】:

我认为原始发帖人的问题引起了很多批评。例如,如果您想使用 GhostScript 生成 .PDF,您需要安装打印机驱动程序并为其创建打印机。您可以通过提前提供一个来抑制多种语言的 Saveas() 对话框。这在早期版本的 IIS 中是可行的(可能不太安全),但在 IIS 8 中更难做到。

我认为这个问题是由 IIS 禁止访问本地打印机队列引起的。这要么是由于在运行时不在 NT AUTHORITY\INTERACTIVE 组中,要么是因为 IIS 会将用户(运行应用程序池的任何人)分为两个组:IIS APPPOOL\ 和 BUILTIN\IIS_IUSRS。

您可以通过使用 Sys Internal 的 Process Explorer 之类的工具查看线程权限来验证所有这些。

【讨论】:

【参考方案4】:

我遇到了同样的问题,我找到了以下解决方案,它对我有用。

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

【讨论】:

以上是关于ASP.NET IIS 服务器端打印失败的主要内容,如果未能解决你的问题,请参考以下文章

IIS 10 上的 ASP.NET Core 404 错误

SignalR入门之多平台SignalR服务端

如何在服务器端 IIS 7 Windows 7 Server 上配置 UrlRewritingNet

asp.net运行原理及机制

asp.net程序在本地IIs运行好用,放到服务器上就出运行时错误

ASP.NET SignalR