使用Office的元件開發相關的應用,許多時候也會需要把這些開發好的應用搬到Web上,而開發Office相關的應用也是多半會與Asp.Net 的Web結合,並且發佈(Publish)到IIS伺服器管理員上,而在這過程中,便會出現許多而外的問題,需要解決與處理,才能順利的在IIS上使用開發好的Office服務。
前言
使用Office的元件開發相關的應用,許多時候也會需要把這些開發好的應用搬到Web上,而開發Office相關的應用也是多半會與Asp.Net 的Web結合,並且發佈(Publish)到IIS伺服器管理員上,而在這過程中,便會出現許多而外的問題,需要解決與處理,才能順利的在IIS上使用開發好的Office服務。
需要做設定的Office類型
為何說會出現很多問題呢?不是在Visual Studio上開發時,若能順利執行應該也就差不多了呀? 因為Visual Studio太方便了,很多權限與存取Office元件 API的問題都處理好了,所以我們在把服務班上至IIS時,便會需要手動設定很多權限的問題。
另外,而Office也有分成多種開發的專案Solution,因此搬到IIS上,只要有任何地方使用到Office元件建議都需要做設定,包含:使用Microsoft.Interop 元件,開發Office增益集,Office Document與Template。(PS :前兩個本人有試過,的確需要,後兩種可能需要再驗證)。
那麼開始我們的設定流程吧!
流程設定
以下的設定,我是以一個Asp.Net 網站專案為例,並稱呼其IIS應用集區為TestWebService。
流程如下,以表格呈現。
步驟說明 |
確認 |
1. 網站Web.config檔案設定加入使用者帳號 |
|
2. IIS設定: 應用程式集區Identity指定ApplicationPoolIdentity |
|
3. DCOM設定使用Office元件之權限: (1.)身分識別指定「執行啟動的使用者」 (2.) 安全性的「啟動和啟用權限」與「存取權限」加入應用程式集區名稱 |
|
4. Office文件存取之資料夾權限設定: 預設為C:\Windows\Temp 中的安全性加入應用程式集區名稱,如果需要不使用此資料夾路徑,則在新的資料夾路徑一樣於安全性加入應用程式集區名稱 |
|
5.加入Desktop資料夾: C:\Windows\System32\config\ systemprofile加入Desktop(32位元Office與64位元Windows) C:\Windows\SysWOW64\config\systemprofile加入Desktop(32位元Office與32位元Windows或64位元Office與64位元) |
1. Web.config檔案設定
開啟Web.config檔案,並在<system.web></system.web>標籤內放下列此行:
<identity impersonate="true" userName="your user name" password="your password"/>
並修改userName的內容為具有此機器的使用者帳號,password的內容為此使用者帳號之密碼,此目的是因為,Office是屬於桌面使用者操作的軟體,平常是有一個身分在做啟動與執行,因此若要自動化,需要有身分作為其啟動的對象,而特過此種方式,便可以讓網站以此身分去驗證。
另外我們也可以直接從IIS上的驗證選項 -> Asp.Net模擬驗證上開啟並設定,加入身分來啟用,如下圖。
2. IIS設定
發行專案後,請針對專案的IIS驗證,檢查是否Asp.Net模擬驗證為啟用,以確認Web.config檔的設定identity impersonate="true"。
亦可打開匿名驗證作為外部請求之驗證測試,如下圖:
此部分驗證真實狀況請依據佈署環境之需求,是否需要其他模式驗證。
並檢查此發行之專案的應用程式集區是否使用的.Net Framework版本為v4.0整合式,此佈署的範例以TestWebService為例子。
並檢查識別是否為ApplicationPoolIdentity用戶類型,ApplicationPoolIdentity是IIS 7.5後的新功能虛擬帳戶,用來區分開來IIS上的執行身分被集中使用,以提高安全行,可以參考介紹 IIS 7.5 的應用程式集區與新增的「虛擬帳戶」特性,當然也可以使用Network Service服務帳戶如下圖。
注意,如果Windows Server是2008 R2以下的版本,請改用Network Service服務帳戶,並且下述權限的設定也都改用Network Service
3. DCOM設定使用Office元件之權限
操作Office的元件在本機開發時可以直接使用本機使用者操作,因為預設已經有含入本機帳戶權限,但是透過IIS後架設後,此專案的執行身分權限已經不適用透過本機帳號,所以會無法運作。
請在執行或進入cmd命令提示字元,輸入dcomcnfg指令,會出現如下圖的元件服務視窗:
點擊電腦->我的電腦->DCOM設定
分別對Microsoft Excel Application 與 Microsoft Word 97 – 2003文件,如下圖
右鍵內容,於識別身分勾選執行啟動的使用者
於安全性的「啟動和啟用權限」與「存取權限」勾選自訂,並開啟編輯室窗
在「從這個位置」選擇本機電腦,並於「輸入物件名稱選取」,輸入IIS的應用程式集區名稱。
注意:如果是Windows Server 2008 R2的版本,可以直接於打上IIS AppPool\你的應用程式集區名稱(如這裡是剛剛IIS指定的TestWebService)來尋找到,因為進階查詢是無法找到的。
而如果在應用程式集區指定的是NetworkService,則可以透過進階->尋找來選取。
確認完成後,於此應用程式集區的權限勾選全部為允許。
4.Office文件存取之資料夾權限設定
由於對Office文件作操作時會需要暫存檔案,而檔案資料夾目錄的存取權限如同Office元件服務一樣沒有包含IIS應用程式集區的權限因此也需加入。
而浮水印之增益集程式保留暫存檔案的路徑是在C:Windows\Temp底下,所以請給予其資料夾權限,如下圖,請勾選完全控制:
5.設定Desktop資料夾
這部分是Office的Legacy問題,一則說法是為了使程式能夠模擬使用這操作,需要的桌面資料夾。
最簡單的做法是設定Desktop資料夾,如果主機是x86作業系統與32位元Office或是x64作業系統與64位元Office,則請在以下路徑加入Desktop的資料夾:
C:\Windows\System32\config\systemprofile
如果是x64作業系統與32位元Office,請在以下路徑加入Desktop資料夾:
C:\Windows\SysWOW64\config\systemprofile
如下圖為x64作業系統與32位元Office的範例:
並且對資料夾的安全性,一樣如上面的方式加入應用程式集區名稱,並設定為完全控制,如下圖:
注意:如前述,如果是NetworkService,請透過進階尋找找到NetworkService帳號。
如此便能順利執行了,並且避開了三種很可能發生的錯誤。
參考資料整理
.NET – Microsoft Excel Cannot Access the File
Configuring a Web Server to Allow Excel File Creation via the Interop.Excel Namespace
IIIS 設定
介紹 IIS 7.5 的應用程式集區與新增的「虛擬帳戶」特性
DCOM設定
[ASP.net/MSSQL] 讀寫Office Excel之前要做的相關設定
[.NET][Office] 使用 Word 2010 在 Server 端將 DOC/DOCX 轉換成 PDF
擷取元件 (CLSID 為 {00024500-0000-0000-C000-000000000046}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80070005 存取被拒。 (發生例外狀況於 HRESULT: 0x80070005 (E_ACCESSDENIED))。
Problems when using Microsoft.Office.Interop.Excel
ASP.NET 透過 Microsoft.Office.Interop.Excel 開啟 Excel 的權限設定
Desktop資料夾設定
Problem running Windows Service with Excel Object on Windows Server 2008 (64 bit)
Excel 2007 automation on top of a Windows Server 2008 x64
Microsoft Office Excel cannot access the file 'c:\inetpub\wwwroot\Timesheet\App_Data\Template.xlsx'
Solved: .NET Excel Interops issue: “Microsoft Office Excel cannot access the file abc.xlsx”
客製 Office COM元件在 Windows Server 2008 & IIS 7 發生無法存取檔案的問題?! - SharePoint 2010 開發
WinServer2008 & IIS & Excel - 無法存取檔案
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝