呼叫Excel的程式無法以排程方式執行

某支呼叫Excel的轉檔程式(做法如前文所述),直接執行正常,移入Windows 2008排程執行,卻發生錯誤:

Task Scheduler successfully completed task "\Run Excel" , instance "{2b987743-dfa2-4883-b7ee-0f26b1534c64}" , action "X:\Temp\RunExcel.exe" with return code 3762504530.

經過實驗,發現將安全選項改為"Run only when user is logged on"可避開問題,切換到"Run whether user is logged on or not"則會產生錯誤。

使用錯誤碼爬文,在MSDN論壇找到一則密技:

手動建個"c:\windows\syswow64\config\systemprofile\desktop"資料夾,就醬!

很多深受Excel無法在排桯執行所苦的網友證言,此技神奇無比一帖見效! 深入搜查找到另一篇MS RD的心得,歸納問題只發生在Windows 2008以Service方式執行Excel Automation時(在Windwos 2003上不會),推測可能因Excel嘗試在Desktop資料夾寫入暫存檔而引發錯誤!

在問題主機加入desktop資料夾,問題迎刃而解! 但是試著在我的本機模擬同一情境,加desktop卻不管用。調整程式,把Exception寫成Log,再配合事件檢視器,整理得到以下線索:

  1. 排程仍出現return code 3762504530錯誤
  2. 程式本身發生的Exception為
    System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
       at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType) ...後面省略... 
  3. 事件檢視器有一則系統錯誤: The machine-default permission settings do not grant Local Activation permission for the COM Server application with CLSID
    {00024500-0000-0000-C000-000000000046}
    and APPID Unavailable  to the user JEFFBOX\jeffrey SID (S-1-5-21-1234…8303-1000) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.
    其中JEFFBOX\jeffrey是執行排程的身分。

事件檢視器訊息很清楚地提出是DCOM預設權限(machine-default permission settings)問題,開啟DCOMCNFG,授予jeffrey帳號"Local Activation"權限。

終於在本機上也成功以排程呼叫Excel。

基於好奇,把desktop資料夾刪除,故意引發錯誤,留下Exception訊息當關鍵字供未來參考:
System.Runtime.InteropServices.COMException (0x800A03EC): Exception from HRESULT: 0x800A03EC
   at Microsoft.Office.Interop.Excel._Workbook.SaveAs(Object Filename, Object FileFormat, Object Password, Object WriteResPassword, Object ReadOnlyRecommended, Object CreateBackup, XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Object TextCodepage, Object TextVisualLayout, Object Local)

最後一個疑問,為什麼設成Run only when user is logged on可以過關,推測是如此讓Excel從當下登入者環境中執行(如同gelis在[元件服務]的[安全性]與[權限]驗證模型一文中所提到的"互動式使用者"選項),狀況較單純無切換成其他執行身分(systemprofile)的需求,但需留意權限範圍無法預期(視當時登入的是誰,權限就有多大)以及無入登入時會掛點的副作用。

【延伸閱讀】

歡迎推文分享:
Published 15 May 2013 08:12 AM 由 Jeffrey
Filed under: ,
Views: 19,152



意見

# 李志洋 said on 19 November, 2014 04:05 AM

在2012 server 上有同樣的問題...

# Nathan said on 02 March, 2015 12:27 AM

感謝分享!

如果沒有這篇大概找不到解決方案。

如果32Bit的作業系統,需新增的路徑則是:

C:\Windows\System32\config\systemprofile\Desktop

參考文章:

Excel 2007 automation on top of a Windows Server 2008 x64

social.msdn.microsoft.com/.../excel-2007-automation-on-top-of-a-windows-server-2008-x64

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2013>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication