80070005 訪問被拒絕,當帶有水晶報表的asp.net網站部署在專用伺服器上時
我有一個 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 帳戶,然後選中所需訪問權限的複選框。
我在執行 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並嘗試確定它正在嘗試做什麼來達到拒絕訪問。這是我在這個問題上的下一步,所以如果我發現任何東西,我會更新這個答案。