這是我以前在一間水果遊戲公司駐點開發的時候,在串他們產報表服務遇到的錯誤。當下以為自己 Cell 服務的方法錯了,試跑一下前人寫的其他幾支有用報表的服務,結果都遇到一樣的錯誤訊息。
錯誤訊息:
<string xmlns="Excel">Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 800703fa Illegal operation attempted on a registry key that has been marked for deletion. (Exception from HRESULT: 0x800703FA).</string>
這個問題偶爾會碰到,然後公司某個人重開一下 Server 就好了。當然,這解法很瞎,而且 Server 能不能重開也不是我能決定的。後來問了一下他們的資深工程師,結果是幫我在十分鐘內重裝好 Office。當然以上都不是正確的解法。我最後跑去解這個問題,是因為我交付給 SA 時報表產不出來。驗收不通過,去翻通知信一堆Error信才知道服務已經死了兩天了......。想到這種大家都在用,卻不知道誰寫的三不管服務要 Debug 就麻煩。誒,感覺被迫背了一個你把服務搞壞的鍋。
進入正文
這個產報表服務是使用本機的 Office 內提供的 Excel 轉 PDF 的功能,在 ASP.NET 上可以使用 Microsoft.Office.Interop.Excel 這個套件,來操作本機的 Office 來進行 Excel 轉 PDF。
而我們的 WebService(就是 ASP.NET) 運行在 IIS 上。這個問題的原因是 IIS 上的一個設定沒有打開,打開後就不會再出錯了。
去該應用程式集區的進階設定
將載入使用者設定檔(Load User Profile)設為True
看這個解法你直覺會知道,是因為沒有使用者權限,造成的問題,而我們 IIS 上剛好有指定識別(Identity)用的帳號。
另外補充,因為 Office 有用到微軟的 COM 服務,COM類沒有使用者權限的這類問題,也會出現這樣的錯誤訊息。
參考資料:
https://learn.microsoft.com/zh-tw/sharepoint/troubleshoot/administration/retrieving-com-class-factory-for-component-failed
https://stackoverflow.com/questions/881132/retrieving-the-com-class-factory-for-component-failed