8

我有一个 asp.net 应用程序,它使用水晶报告显示报告。该应用程序在我的本地 PC 上正常工作。我在我们的专用服务器上部署了这个应用程序,并且还在专用服务器上安装了水晶报告运行时间引擎。当我尝试按报告以查看报告,我收到上述错误。我将文件夹“C:\Windows\Temp”的权限更改为完全控制(通过选择“临时”文件夹的属性,所有用户的完全控制权限(IIS用户,网络..等))。我不确定这是否是授予此文件夹完全控制权限的正确方法(我不太了解网络概念)。但我仍然遇到同样的错误.错误是:

由于以下错误,检索具有 CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B} 的组件的 COM 类工厂失败:80070005 访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.UnauthorizedAccessException:检索具有 CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B} 的组件的 COM 类工厂失败,原因是以下错误:80070005 访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))。

ASP.NET 无权访问请求的资源。考虑向 ASP.NET 请求标识授予对资源的访问权限。ASP.NET 有一个基本进程标识(通常是 IIS 5 上的 {MACHINE}\ASPNET 或 IIS 6 和 IIS 7 上的网络服务,以及 IIS 7.5 上配置的应用程序池标识),如果应用程序不是模拟的,则使用该标识。如果应用程序通过 模拟,则身份将是匿名用户(通常是 IUSR_MACHINENAME)或经过身份验证的请求用户。

要授予 ASP.NET 对文件的访问权限,请在资源管理器中右键单击该文件,选择“属性”并选择“安全”选项卡。单击“添加”以添加相应的用户或组。突出显示 ASP.NET 帐户,然后选中所需访问权限的复选框。

4

2 回答 2

15

我在运行 IIS6 的客户端的 windows server 2003 机器上遇到了同样的问题。与普通服务器相比,他们的服务器非常锁定,锁定中的某些东西可能是问题所在。我在其他几十个客户的服务器上都没有遇到过这个问题。我还没有解决这个问题,但这里是我迄今为止学到的一些步骤......

首先要做的是仔细检查您的应用程序在哪个应用程序池下运行,然后检查应用程序池正在使用哪个标识(例如网络服务或应用程序池标识或......)。这对于确保您向正确的用户授予权限非常重要。在您确定这一点之前,不要再进一步。

接下来检查您是否使用IIS Impersonation(除非您知道它是什么,否则您可能不会使用)。这是应用程序池以用户身份运行的地方......只有在您使用 Windows 身份验证并且在 web.config 中您拥有<identity impersonate="true" />. 如果您使用模拟,那么您可能必须为最终用户提供所有必要的文件和/或 COM 访问权限。如果不是(在我的情况下),它应该只是检查权限是否适合您的应用程序池的用户或 IIS 用户组。

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

  • 如果它是 64 位机器,请检查您是否已Enable 32-bit applications启用应用程序池(或者您是否安装了 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. 从该注册表项的(默认)值获取路径,并检查该路径的父文件夹的权限。尝试将完全控制权授予正确身份的文件夹,看看是否能解决问题。
  • 我不确定这是否相关,但可能添加<startup useLegacyV2RuntimeActivationPolicy="true">到 web.config 可能会有所帮助......在这篇文章中提出了与具有类似问题的不同 COM 应用程序相关的建议,因此值得一试吗?所以你可以在 web.config 的标签中添加这个:

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

    • 从控制面板 > 管理工具打开组件服务
    • 展开组件服务 > 计算机 > 我的电脑,然后右键单击 > 属性
    • 单击 COM 安全选项卡
    • 在 Launch and Activation Permissions 点击 Edit Default... 按钮
    • 检查列出的启动和激活权限。如果您的应用程序池用户未列出,可以尝试添加所有 4 允许权限并重新测试。如果这不能解决问题,则撤消任何更改。
  • 如果这些都没有解决它,那么我建议下载Process Monitor并尝试确定它正在尝试做什么来达到拒绝访问。这是我在这个问题上的下一步,所以如果我发现任何东西,我会更新这个答案。
于 2013-02-20T00:20:34.357 回答
0

我刚刚将我的网站移至默认应用程序池,它就可以工作了。我将 32 位应用程序配置为启用并标识到 NetworkService。

于 2015-11-03T00:23:57.247 回答