在部署Word/Excel到服務器的時候,經常會碰到權限問題.例如;
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 8000401a 因為配置類型不正確,系統無法開始服務器進程。請檢查用戶名和密碼。 (Exception from HRESULT: 0x8000401A).

Retrieving the COM class factory for component with CLSID {3AACC1CC-7377-11D5-B316-0800309CC2CE} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
類似這種錯誤,網上搜一搜,會有一大堆的答案.大部分是與權限相關,而且大多建議試用asp.net模擬權限的方法解決.
在web.config中配置:
<identity impersonate="true" userName="XXX" password="XXX"/>
配上管理員的賬號和密碼,即可正常試用了.但是這樣的方法合適嗎?讓asp.net以管理員身份運行,總覺得會有安全隱患.
這次因為研究分布式存儲的原因,在兩台服務器之間通過虛擬目錄共享了文件夾,將IIS App Pool的運行賬戶使用了特定的用戶.
就引起了權限上的問題.正好弄明白一下.
通過Google,發現Word/Excel其實不適合做自動化:
Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.
再找到MS的官方文檔:
Microsoft Office 所有當前版本的設計、測試和配置都是為在客戶端工作站上作為最終用戶產品運行而完成的。它們假定存在一個交互式桌面和用戶配置文件,而且不提供滿足為以無人參與方式運行而設計的服務器端組件的需要所必需的重入或安全性級別。
Microsoft 目前建議不要從任何無人參與的、非交互式客戶端應用程序或組件(包括 ASP、DCOM 和 NT Service)中進行 Microsoft Office 應用程序的“自動化”,也不為此提供支持,因為 Office 在這種環境中運行時可能會出現不穩定的現象並且/或者會死鎖。
如果您要構建在服務器端上下文中運行的解決方案,應盡可能嘗試使用對於以無人參與方式執行很安全的組件,或找到至少允許一部分代碼在客戶端運行的備選方案。如果您選擇從服務器端解決方案中運行 Office 應用程序,將發現這樣會缺少成功運行所必需的許多功能,而且整體解決方案的穩定性會有風險。
使用服務器端 Office 自動化時出現的問題
嘗試在服務器端解決方案中使用 Office 的開發人員需要了解 Office 的表現因環境而與預期不同的五個主要問題。要成功運行您的代碼,就需要解決這些問題,而且需要盡可能減少它們的影響。您在構建應用程序時,要仔細考慮這些問題,因為沒有任何一種解決方案能解決所有這些問題,不同的設計要求您優先考慮不同的元素。
用戶身份:Office 應用程序在運行時會假定存在一個用戶身份,即使在它們由“自動化”啟動時也是如此。它們嘗試根據用戶注冊表配置單元中的設置為啟動應用程序的用戶初始化工具欄、菜單、選項、打印機和一些加載項。許多服務會在沒有用戶配置文件的帳戶(例如,SYSTEM 或 IWAM_[servername] 帳戶)下運行,因此,Office 可能無法在啟動時進行正確的初始化,進而返回一個有關“CreateObject”或“CoCreateInstance”的錯誤。即使能夠在沒有用戶配置文件的情況下啟動 Office 應用程序,其他功能也可能無法正常工作。如果您計划從某個服務進行“Office 自動化”,需要配置您的代碼或 Office,以便它使用某個已加載的用戶配置文件來運行。
與桌面的交互性:Office 應用程序假定它們在某個交互式桌面下運行,在有些情況下,可能需要讓用戶看到它們以便某些“自動化”功能正常運行。如果發生意外錯誤,或者需要一個未指定的參數才能完成某項功能,根據設計,Office 會用一個模式對話框提示用戶,詢問用戶要進行什么操作。非交互式桌面上的模式對話框是無法取消的,這就導致該線程無限期地停止響應(掛起)。雖然有些代碼編寫的經驗做法有助於減少發生這種情況的可能性,但還是無法做到完全防止。正是這種情況使得從服務器端環境運行 Office 應用程序帶有風險,而且不受支持。
重入和可伸縮性:服務器端組件需要是具有較高可重入性的多線程 COM 組件,這些組件在有多個客戶端時開銷最少而吞吐量較高。Office 應用程序在幾乎所有方面都正好相反。它們是非重入的、基於 STA 的“自動化”服務器,是為給一個客戶端提供多種多樣但占用資源較多的功能而設計的。它們作為服務器端解決方案提供不了多少可伸縮性,而且對於重要元素有固定的限制,例如,對於內存,無法通過配置進行更改。更重要的是,它們要使用全局性資源(例如,映射到內存的文件、全局加載項或模板,以及共享的“自動化”服務器),這樣可能會限制能夠並發運行的實例的數量,而且,如果它們是在多客戶端環境中配置的,還可能導致爭用的情況。開發人員如果計划同時運行多個任意“Office 應用程序”的實例,就需要考慮“后台處理”或序列化對“Office 應用程序”的訪問,以避免可能出現的死鎖或數據損壞。
復原性和穩定性:Office 2000、Office XP 和 Office 2003 使用 Microsoft Windows 安裝程序 (MSI) 技術,以使最終用戶在進行安裝和自行修復時更加容易。MSI 推出了“首次使用時安裝”的概念,允許在運行時動態安裝或配置功能(針對系統,或者更多地針對特定用戶)。在服務器端環境中,這會既降低性能,又增加出現要求用戶同意安裝或提供相應安裝盤的對話框的可能性。雖然此設計旨在增強 Office 作為最終用戶產品的復原性,但 Office 實現 MSI 功能在服務器端環境中還是會對生產力帶來不利影響。此外,在服務器端運行時,Office 的穩定性通常無法得到保障,因為它尚未為這樣使用而進行設計或測試。在網絡服務器上使用 Office 作為服務組件可能會降低這台計算機的穩定性,進而降低您的網絡作為一個整體的穩定性。如果您計划在服務器端自動運行 Office,請嘗試將該程序隔離到一台專用計算機上,該計算機不能影響重要功能,而且在需要時可以重新啟動。
服務器端安全性:Office 應用程序從來都不是為在服務器端使用而准備的,因此,請不要考慮分布式組件所面臨的安全性問題。Office 不對傳入的請求進行身份驗證,而且不會保護您免受無意中從服務器端代碼中運行宏或啟動另一台可能會運行宏的服務器的損害。不要打開從匿名網站上載到服務器上的文件!基於上一次設置的安全性設置,服務器可能會在具有全部特權的 Administrator 或 System 上下文下運行宏,並危及您的網絡的安全!另外,Office 使用很多客戶端組件(例如,Simple MAPI、WinInet、MSDAIPP),它們會緩存客戶端身份驗證信息以加快處理速度。如果在服務器端進行 Office 自動化,則一個實例可能為多個客戶端提供服務,而且由於已經為該會話緩存了身份驗證信息,就有可能出現這樣的情況:一個客戶端可以使用另一個客戶端的緩存憑據,從而通過模擬其他用戶獲得未經授予的訪問權限。
除了要考慮技術問題以外,您還必須考慮這樣一種設計在許可方面的可行性。目前的許可原則禁止在服務器上使用“Office 應用程序”為客戶端請求提供服務,除非那些客戶端自己具有 Office 的許可副本。《最終用戶許可協議》(EULA) 沒有涉及使用服務器端“自動化”向未經許可的工作站提供 Office 功能的情況。
但是按模板生成word/excel是一個很頻繁的需求,這個功能非常常用,又實用.暫時也沒時間找替代方案,只好找辦法解決權限問題.
繼續Google,發現可以通過DCOM配置的方式.其做法都是將DCOM配置中的Excel運行賬戶添加到安全選項卡下的"啟動和激活","訪問","配置"中.

這里將為IIS App Pool配置的運行賬戶提交到這3個選項中.
PS:發現權限中沒有管理組的賬號,導致一個問題,asp.net能正常運行excel,但是直接在左面上無法打開,報錯"無法嵌入對象".

安全介紹:
項目 詳細信息
啟動和激活權限
單擊以下選項按鈕之一:
使用默認值:單擊此按鈕以指定應用程序使用在計算機屬性頁的“COM 安全”選項卡上設置的默認權限。
自定義:單擊此按鈕以指定應用程序使用您設置的權限。若要更改權限,請單擊“編輯”。
訪問權限
單擊以下選項按鈕之一:
使用默認值:單擊此按鈕以指定應用程序使用在計算機屬性頁面的“COM 安全”選項卡上設置的默認權限。
自定義:單擊此按鈕以指定應用程序使用您設置的權限。若要更改權限,請單擊“編輯”。
配置權限
單擊以下選項按鈕之一:
使用默認值:單擊此按鈕以指定應用程序使用默認的注冊表配置權限。
自定義:單擊此按鈕以指定應用程序使用您設置的注冊表配置權限。若要更改權限,請單擊“編輯”。
在標識中"交互式","啟動","特定"到底應該怎樣選擇呢?其實通過MS的文檔,可以很容易理解.
asp.net啟動的情況,適合於"啟動用戶".
PS:注意安全策略.

標識介紹:
“交互式用戶”選項按鈕
單擊以指定應用程序在當前已登錄該計算機的用戶身份下運行。對應用程序進行身份驗證以訪問資源時將使用此用戶的安全憑據。
“啟動用戶”選項按鈕
單擊以指定應用程序使用已啟動該應用程序的用戶(啟動用戶)的安全上下文運行,以便可以在域中對該應用程序進行身份驗證。啟動用戶可以是交互式用戶。
“下列用戶”選項按鈕
單擊以指定應用程序使用指定用戶帳戶的安全上下文運行,以便可以在域中對該應用程序進行身份驗證。鍵入用戶名和密碼。
“系統帳戶”選項按鈕
單擊以指定服務器應用程序使用內置系統帳戶的安全上下文運行。此選項僅對作為服務安裝的應用程序可用。