好好的程式,跑到了農曆七月,就出現問題…
公司之前一位高手寫的程式,在 Web Server 上,接受 User 上傳 Excel 檔案後,啟動 Excel 進行拆解並存入資料庫之中,
很神奇的地方是,壞掉的原因為:
Access denied (E_ACCESSDENIED (0x80070005):拒絕存取
但只壞了一半,如果使用原本執行緒開啟 Excel 存入來自資料庫的資料後讓 User 下載 Excel 是 OK 的哦,只有當開啟另外一個執行緒做長時間處理才會發生,
看完了黑暗大哥的茶包射手專欄後,也依樣畫葫蘆地拿了 FileMon 及 ProcMon(Access Denied 嘛~簡單~簡單~),呃…
完全沒有 File Access Denied 的問題,都是 SUCCESS。
後來發現可能是啟動 Excel.Application 這個元件的權限問題,開啟了 DOM Config (註一),選擇 [Microsoft Excel Application],
當然,以上圖片的範例,將存取、啟動權都設給 Everyone 是很蠢的一件事,請依執行身份付與權限(e.g. Network Service or IUser_XXXXXX)
設定好後,再啟動程式後就 OK 囉。
另外提到一點,這個跟 ASP CreateObject 失敗也是一樣的問題,都是在於啟動 Excel.Appliction 物件的身份問題(詳見附錄文章)。
**Server 端處理 Excel 推薦的工具**
讀取 Excel 可以使用 Excel for ADO -- KB278973 (http://support.microsoft.com/kb/278973/) ExcelADO 示範使用 ADO 在 Excel 活頁簿讀取和寫入資料的方法
匯出 Excel 可以使用這個 ---- CarlosAg Excel Xml Writer Library (http://www.carlosag.net/Tools/ExcelXmlWriter/Default.aspx)
備註:
一、Windows 2000/2003 需要在[開始]->[執行]鍵入 DCOMCNFG.exe 後開啟。Windows 2003/XP 請進入[元件服務]->[DCOM設定]
**推薦的文章**
MSFT-KB-Office 伺服器端自動化的考量因素
http://support.microsoft.com/?kbid=257757
http://support.microsoft.com/kb/257757/en-us (英文版)
===========================================================================================================================================
CreateObject/CoCreateInstance 會傳回下列執行階段錯誤訊息,且無法啟動自動化。
在 Microsoft Visual Basic (VB) 或 ASP 中:
•訊息 1
Run-time error '429':ActiveX component cannot create object (執行階段錯誤 '429':ActiveX 元件無法建立物件)
•訊息 2
Run-time error '70':Permission denied (執行階段錯誤 '70':使用權限被拒)
在 Microsoft Visual C 或 Visual C++ 中:
•訊息 1
CO_E_SERVER_EXEC_FAILURE (0x80080005):Server execution failed (CO_E_SERVER_EXEC_FAILURE (0x80080005):伺服器執行失敗)
•訊息 2
E_ACCESSDENIED (0x80070005):Access denied (E_ACCESSDENIED (0x80070005):拒絕存取)
會出現這些錯誤的原因,是因為伺服器端程式碼是在沒有使用者設定檔的情況下執行,或者為啟動環境指定的使用者身分識別沒有適當的 DCOM 權限。
===========================================================================================================================================
[技術]KB