80070005当具有水晶报告的asp.net网站部署在专用服务器上时,访问被拒绝

时间:2012-12-24 09:19:08

标签: asp.net hosting crystal-reports-2008

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

  

使用CLSID检索组件的COM类工厂   {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}因以下原因失败   错误:80070005访问被拒绝。 (HRESULT的例外情况:0x80070005   (E_ACCESSDENIED))。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.UnauthorizedAccessException:正在检索   具有CLSID的组件的COM类工厂   {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}因以下原因失败   错误: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帐户,和   选中所需访问的框。

2 个答案:

答案 0 :(得分:12)

我在运行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可能会有所帮助... this post中有人建议与其他COM应用程序有关类似的问题值得一试吗?所以你要在web.config中的标签内添加它:

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

    • 从控制面板打开组件服务&gt;管理工具
    • 展开组件服务&gt;电脑&gt;我的电脑然后右键单击&gt;物业
    • 单击“COM安全性”选项卡
    • 在启动和激活权限中,单击编辑默认...按钮
    • 检查列出的启动和激活权限权限。如果未列出您的应用程序池用户,可以尝试添加所有4个允许权限并重新测试。如果这不能解决问题,那么撤消任何更改。
  • 如果这一切都没有解决,那么我建议下载Process Monitor并尝试确定它正在尝试做什么来达到拒绝访问权限。这是我解决问题的下一步,所以如果我发现任何问题,我会更新这个答案。

答案 1 :(得分:0)

我刚将我的网站移动到默认的应用程序池并且已经完成了工作。 我将32位应用程序配置为启用和压缩NetworkService。