当将带有Crystal Report的ASP.NET网站部署到专用服务器上时,出现“80070005访问被拒绝”的错误。

8
我有一个asp.net应用程序,它使用Crystal Report显示报表。该应用程序在我的本地PC上正常工作。我将此应用程序部署到我们的专用服务器上,并在该服务器上安装了Crystal Report运行时引擎。当我尝试按下报告以查看报告时,出现上述错误。我将"C:\Windows\Temp"文件夹的权限更改为完全控制(通过选择“temp”文件夹的属性,为所有用户(IIS-users、network..等)分配完全控制权限),我不确定这是否是将完全控制权限授予此文件夹的正确方法(我对网络概念不是那么了解)。但我仍然收到相同的错误。错误信息如下: 无法检索带有CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}组件的COM类工厂,由于以下错误:80070005 访问被拒绝。(HRESULT: 0x80070005(E_ACCESSDENIED) 的异常。 说明:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误和代码中原始位置的更多信息。
异常详细信息:System.UnauthorizedAccessException: 由于以下错误:80070005 访问被拒绝。(HRESULT: 0x80070005(E_ACCESSDENIED)),无法检索具有CLSID{4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}组件的COM类工厂。
ASP.NET没有获得访问所请求资源的权限。请考虑授予ASP.NET请求标识对资源的访问权限。如果应用程序未模拟,则ASP.NET具有基本进程标识(通常在IIS 5上为{MACHINE}\ASPNET或在IIS 6和IIS 7上为Network Service,在IIS 7.5上配置的应用程序池标识)。如果应用程序通过模拟,身份将是匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户。
要授予ASP.NET对文件的访问权限,请右键单击资源管理器中的文件,选择“属性”并选择“安全”选项卡。单击“添加”以添加适当的用户或组。将ASP.NET帐户突出显示,并选中所需访问权限的复选框。

请问服务器运行的是哪个版本的Windows和IIS,是否为64位? - Rory
3个回答

15

我在一个客户的Windows Server 2003机器上遇到了同样的问题,该机器运行着IIS6。与普通服务器相比,他们的服务器非常受限制,其中某些限制可能是问题的原因。我在数十个其他客户的服务器上没有遇到这个问题。我还没有解决这个问题,但从目前为止我学到的一些步骤如下:

首先要做的是仔细检查您的应用程序正在哪个应用程序池中运行,然后检查应用程序池正在使用哪个身份验证(例如网络服务或应用程序池身份验证等)。这很重要,以确保您将权限授予正确的用户。在确定这一点之前,请不要再深入研究。

接下来,请检查您是否正在使用IIS模拟(除非您知道它是什么,否则可能不会使用)。这是应用程序池在某种程度上运行在用户身份下的地方...只有在使用Windows身份验证并且在web.config中有<identity impersonate="true" />时,才会出现这种情况。如果您正在使用模拟,则可能必须为最终用户提供所有必要的文件和/或COM访问权限。如果没有(就像我一样),这只是检查应用程序池用户或IIS用户组的权限是否正确的问题。

一旦您知道了权限的正确身份验证,尝试以下步骤:

  • 如果是64位机器,请检查是否启用了应用程序池的启用32位应用程序选项(或已安装64位运行时)。
  • 检查应用程序池身份验证是否具有对C:\Windows\Temp文件夹的访问权限(您已经提到过这一点,但我想为遇到此问题的其他人列出它)。
  • 检查应用程序池身份是否具有对Crystal Reports文件夹的访问权限,例如C:\Program Files\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\。您可以通过打开regedit.exe并导航到HKEY_CLASSES_ROOT\CLSID\{4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}\InProcServer32找到该文件夹。从该注册表键的(默认)值获取路径,并检查该路径的父文件夹的权限。尝试将完全控制权限授予正确的身份以查看是否解决了问题。
  • 我不确定这是否相关,但可能向web.config添加<startup useLegacyV2RuntimeActivationPolicy="true">可能会有所帮助...在这篇文章中提到了一个不同的COM应用程序遇到类似问题时建议这样做。因此,在web.config的<configuration>标签内部添加此内容:

    <startup useLegacyV2RuntimeActivationPolicy="true"> 
         <supportedRuntime version="v4.0"/> 
    </startup>
    
  • 检查服务器上的COM权限:

    • 从控制面板 > 管理工具中打开组件服务
    • 展开组件服务 > 计算机 > 我的计算机,然后右键单击 > 属性
    • 单击COM 安全选项卡
    • 在启动和激活权限中,单击编辑默认值按钮
    • 检查列出的启动和激活权限权限。如果您的应用程序池用户未列出,则可以尝试添加所有 4 个允许权限并重新测试。如果这无法解决问题,则撤销任何更改。
  • 如果以上方法都没有解决问题,我建议下载进程监视器(Process Monitor)并尝试确定它正在尝试的受到拒绝访问的操作。这是我在解决问题时的下一步,如果我发现任何信息,我会更新此答案。

我在64位服务器上遇到了同样的问题。对于应用程序池,即使我安装了64位运行时,我也必须启用32位。 - Ioannis
2
这里有很好的诊断步骤,我的问题是该进程没有读取文件的权限 - 进程监视器帮了忙。 - David Martin

0

我刚把我的网站移动到默认应用程序池,它可以正常工作了。 我配置了32位应用程序启用,并将身份设置为NetworkService。


0

如果您正在运行64位操作系统

请右键单击以下路径中的文件:C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sacommlayer.dll,并为特定用户授予读/写权限,然后重新启动IIS即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接