[Office | IIS] 在IIS上存取(Access)使用Office COM元件(Interop Word Excel)的設定流程(Configuration)

使用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 :前兩個本人有試過,的確需要,後兩種可能需要再驗證)。

 

Microsoft-Interop-word-excel-office

 

Office-Addin

 

那麼開始我們的設定流程吧!

 

 

流程設定

 


 

以下的設定,我是以一個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模擬驗證上開啟並設定,加入身分來啟用,如下圖。

ASPNET_impersonate

 

 

 

2. IIS設定

發行專案後,請針對專案的IIS驗證,檢查是否Asp.Net模擬驗證為啟用,以確認Web.config檔的設定identity impersonate="true"。

亦可打開匿名驗證作為外部請求之驗證測試,如下圖:

Identity驗證身分

 

此部分驗證真實狀況請依據佈署環境之需求,是否需要其他模式驗證。

並檢查此發行之專案的應用程式集區是否使用的.Net Framework版本為v4.0整合式,此佈署的範例以TestWebService為例子。

AppPool應用程式集區

 

並檢查識別是否為ApplicationPoolIdentity用戶類型,ApplicationPoolIdentity是IIS 7.5後的新功能虛擬帳戶,用來區分開來IIS上的執行身分被集中使用,以提高安全行,可以參考介紹 IIS 7.5 的應用程式集區與新增的「虛擬帳戶」特性,當然也可以使用Network Service服務帳戶如下圖。

IISAppPoolIdentity應用程式集區識別

 

注意,如果Windows Server2008 R2以下的版本,請改用Network Service服務帳戶,並且下述權限的設定也都改用Network Service

 

3. DCOM設定使用Office元件之權限

操作Office的元件在本機開發時可以直接使用本機使用者操作,因為預設已經有含入本機帳戶權限,但是透過IIS後架設後,此專案的執行身分權限已經不適用透過本機帳號,所以會無法運作。

請在執行或進入cmd命令提示字元,輸入dcomcnfg指令,會出現如下圖的元件服務視窗:

DCOMCNFG

 

點擊電腦->我的電腦->DCOM設定

分別對Microsoft Excel Application 與 Microsoft Word 97 – 2003文件,如下圖

Word-Excel-COM-Setting

 

右鍵內容,於識別身分勾選執行啟動的使用者

身分識別

 

於安全性的「啟動和啟用權限」與「存取權限」勾選自訂,並開啟編輯室窗

DCOM安全性設定

 

在「從這個位置」選擇本機電腦,並於「輸入物件名稱選取」,輸入IIS的應用程式集區名稱。

身分加入

 

注意:如果是Windows Server 2008 R2的版本,可以直接於打上IIS AppPool\你的應用程式集區名稱(如這裡是剛剛IIS指定的TestWebService)來尋找到,因為進階查詢是無法找到的。

而如果在應用程式集區指定的是NetworkService,則可以透過進階->尋找來選取。

確認完成後,於此應用程式集區的權限勾選全部為允許。

設定選擇 

 

 

 

4.Office文件存取之資料夾權限設定

由於對Office文件作操作時會需要暫存檔案,而檔案資料夾目錄的存取權限如同Office元件服務一樣沒有包含IIS應用程式集區的權限因此也需加入。

而浮水印之增益集程式保留暫存檔案的路徑是在C:Windows\Temp底下,所以請給予其資料夾權限,如下圖,請勾選完全控制:

Office Folder Access Setting 文件存取設定

 

 

 

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的範例:

Add Desktop 桌面資料夾

 

並且對資料夾的安全性,一樣如上面的方式加入應用程式集區名稱,並設定為完全控制,如下圖:

設定權限

 

注意:如前述,如果是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))。

The Solution of using ASP.NET Create Excel in Windows 2008 x64 with 80070005(在x64位元的系統上執行ASP.NET產生Excel遇到80070005 存取被拒解決方式)

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 - 無法存取檔案

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝