在部署Word/Excel到服務(wù)器的時(shí)候,經(jīng)常會(huì)碰到權(quán)限問題.例如; Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 8000401a 因?yàn)榕渲妙愋筒徽_,系統(tǒng)無法開始服務(wù)器進(jìn)程。請(qǐng)檢查用戶名和密碼。 (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)).
類似這種錯(cuò)誤,網(wǎng)上搜一搜,會(huì)有一大堆的答案.大部分是與權(quán)限相關(guān),而且大多建議試用asp.net模擬權(quán)限的方法解決.
在web.config中配置:
<identity impersonate="true" userName="XXX" password="XXX"/>
配上管理員的賬號(hào)和密碼,即可正常試用了.但是這樣的方法合適嗎?讓asp.net以管理員身份運(yùn)行,總覺得會(huì)有安全隱患.
這次因?yàn)檠芯糠植际酱鎯?chǔ)的原因,在兩臺(tái)服務(wù)器之間通過虛擬目錄共享了文件夾,將IIS App Pool的運(yùn)行賬戶使用了特定的用戶.
就引起了權(quán)限上的問題.正好弄明白一下.
通過Google,發(fā)現(xiàn)Word/Excel其實(shí)不適合做自動(dòng)化:
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 所有當(dāng)前版本的設(shè)計(jì)、測(cè)試和配置都是為在客戶端工作站上作為最終用戶產(chǎn)品運(yùn)行而完成的。它們假定存在一個(gè)交互式桌面和用戶配置文件,而且不提供滿足為以無人參與方式運(yùn)行而設(shè)計(jì)的服務(wù)器端組件的需要所必需的重入或安全性級(jí)別。
Microsoft 目前建議不要從任何無人參與的、非交互式客戶端應(yīng)用程序或組件(包括 ASP、DCOM 和 NT Service)中進(jìn)行 Microsoft Office 應(yīng)用程序的“自動(dòng)化”,也不為此提供支持,因?yàn)?Office 在這種環(huán)境中運(yùn)行時(shí)可能會(huì)出現(xiàn)不穩(wěn)定的現(xiàn)象并且/或者會(huì)死鎖。
如果您要構(gòu)建在服務(wù)器端上下文中運(yùn)行的解決方案,應(yīng)盡可能嘗試使用對(duì)于以無人參與方式執(zhí)行很安全的組件,或找到至少允許一部分代碼在客戶端運(yùn)行的備選方案。如果您選擇從服務(wù)器端解決方案中運(yùn)行 Office 應(yīng)用程序,將發(fā)現(xiàn)這樣會(huì)缺少成功運(yùn)行所必需的許多功能,而且整體解決方案的穩(wěn)定性會(huì)有風(fēng)險(xiǎn)。
使用服務(wù)器端 Office 自動(dòng)化時(shí)出現(xiàn)的問題
嘗試在服務(wù)器端解決方案中使用 Office 的開發(fā)人員需要了解 Office 的表現(xiàn)因環(huán)境而與預(yù)期不同的五個(gè)主要問題。要成功運(yùn)行您的代碼,就需要解決這些問題,而且需要盡可能減少它們的影響。您在構(gòu)建應(yīng)用程序時(shí),要仔細(xì)考慮這些問題,因?yàn)闆]有任何一種解決方案能解決所有這些問題,不同的設(shè)計(jì)要求您優(yōu)先考慮不同的元素。
用戶身份:Office 應(yīng)用程序在運(yùn)行時(shí)會(huì)假定存在一個(gè)用戶身份,即使在它們由“自動(dòng)化”啟動(dòng)時(shí)也是如此。它們嘗試根據(jù)用戶注冊(cè)表配置單元中的設(shè)置為啟動(dòng)應(yīng)用程序的用戶初始化工具欄、菜單、選項(xiàng)、打印機(jī)和一些加載項(xiàng)。許多服務(wù)會(huì)在沒有用戶配置文件的帳戶(例如,SYSTEM 或 IWAM_[servername] 帳戶)下運(yùn)行,因此,Office 可能無法在啟動(dòng)時(shí)進(jìn)行正確的初始化,進(jìn)而返回一個(gè)有關(guān)“CreateObject”或“CoCreateInstance”的錯(cuò)誤。即使能夠在沒有用戶配置文件的情況下啟動(dòng) Office 應(yīng)用程序,其他功能也可能無法正常工作。如果您計(jì)劃從某個(gè)服務(wù)進(jìn)行“Office 自動(dòng)化”,需要配置您的代碼或 Office,以便它使用某個(gè)已加載的用戶配置文件來運(yùn)行。
與桌面的交互性:Office 應(yīng)用程序假定它們?cè)谀硞€(gè)交互式桌面下運(yùn)行,在有些情況下,可能需要讓用戶看到它們以便某些“自動(dòng)化”功能正常運(yùn)行。如果發(fā)生意外錯(cuò)誤,或者需要一個(gè)未指定的參數(shù)才能完成某項(xiàng)功能,根據(jù)設(shè)計(jì),Office 會(huì)用一個(gè)模式對(duì)話框提示用戶,詢問用戶要進(jìn)行什么操作。非交互式桌面上的模式對(duì)話框是無法取消的,這就導(dǎo)致該線程無限期地停止響應(yīng)(掛起)。雖然有些代碼編寫的經(jīng)驗(yàn)做法有助于減少發(fā)生這種情況的可能性,但還是無法做到完全防止。正是這種情況使得從服務(wù)器端環(huán)境運(yùn)行 Office 應(yīng)用程序帶有風(fēng)險(xiǎn),而且不受支持。
重入和可伸縮性:服務(wù)器端組件需要是具有較高可重入性的多線程 COM 組件,這些組件在有多個(gè)客戶端時(shí)開銷最少而吞吐量較高。Office 應(yīng)用程序在幾乎所有方面都正好相反。它們是非重入的、基于 STA 的“自動(dòng)化”服務(wù)器,是為給一個(gè)客戶端提供多種多樣但占用資源較多的功能而設(shè)計(jì)的。它們作為服務(wù)器端解決方案提供不了多少可伸縮性,而且對(duì)于重要元素有固定的限制,例如,對(duì)于內(nèi)存,無法通過配置進(jìn)行更改。更重要的是,它們要使用全局性資源(例如,映射到內(nèi)存的文件、全局加載項(xiàng)或模板,以及共享的“自動(dòng)化”服務(wù)器),這樣可能會(huì)限制能夠并發(fā)運(yùn)行的實(shí)例的數(shù)量,而且,如果它們是在多客戶端環(huán)境中配置的,還可能導(dǎo)致爭(zhēng)用的情況。開發(fā)人員如果計(jì)劃同時(shí)運(yùn)行多個(gè)任意“Office 應(yīng)用程序”的實(shí)例,就需要考慮“后臺(tái)處理”或序列化對(duì)“Office 應(yīng)用程序”的訪問,以避免可能出現(xiàn)的死鎖或數(shù)據(jù)損壞。
復(fù)原性和穩(wěn)定性:Office 2000、Office XP 和 Office 2003 使用 Microsoft Windows 安裝程序 (MSI) 技術(shù),以使最終用戶在進(jìn)行安裝和自行修復(fù)時(shí)更加容易。MSI 推出了“首次使用時(shí)安裝”的概念,允許在運(yùn)行時(shí)動(dòng)態(tài)安裝或配置功能(針對(duì)系統(tǒng),或者更多地針對(duì)特定用戶)。在服務(wù)器端環(huán)境中,這會(huì)既降低性能,又增加出現(xiàn)要求用戶同意安裝或提供相應(yīng)安裝盤的對(duì)話框的可能性。雖然此設(shè)計(jì)旨在增強(qiáng) Office 作為最終用戶產(chǎn)品的復(fù)原性,但 Office 實(shí)現(xiàn) MSI 功能在服務(wù)器端環(huán)境中還是會(huì)對(duì)生產(chǎn)力帶來不利影響。此外,在服務(wù)器端運(yùn)行時(shí),Office 的穩(wěn)定性通常無法得到保障,因?yàn)樗形礊檫@樣使用而進(jìn)行設(shè)計(jì)或測(cè)試。在網(wǎng)絡(luò)服務(wù)器上使用 Office 作為服務(wù)組件可能會(huì)降低這臺(tái)計(jì)算機(jī)的穩(wěn)定性,進(jìn)而降低您的網(wǎng)絡(luò)作為一個(gè)整體的穩(wěn)定性。如果您計(jì)劃在服務(wù)器端自動(dòng)運(yùn)行 Office,請(qǐng)嘗試將該程序隔離到一臺(tái)專用計(jì)算機(jī)上,該計(jì)算機(jī)不能影響重要功能,而且在需要時(shí)可以重新啟動(dòng)。
服務(wù)器端安全性:Office 應(yīng)用程序從來都不是為在服務(wù)器端使用而準(zhǔn)備的,因此,請(qǐng)不要考慮分布式組件所面臨的安全性問題。Office 不對(duì)傳入的請(qǐng)求進(jìn)行身份驗(yàn)證,而且不會(huì)保護(hù)您免受無意中從服務(wù)器端代碼中運(yùn)行宏或啟動(dòng)另一臺(tái)可能會(huì)運(yùn)行宏的服務(wù)器的損害。不要打開從匿名網(wǎng)站上載到服務(wù)器上的文件!基于上一次設(shè)置的安全性設(shè)置,服務(wù)器可能會(huì)在具有全部特權(quán)的 Administrator 或 System 上下文下運(yùn)行宏,并危及您的網(wǎng)絡(luò)的安全!另外,Office 使用很多客戶端組件(例如,Simple MAPI、WinInet、MSDAIPP),它們會(huì)緩存客戶端身份驗(yàn)證信息以加快處理速度。如果在服務(wù)器端進(jìn)行 Office 自動(dòng)化,則一個(gè)實(shí)例可能為多個(gè)客戶端提供服務(wù),而且由于已經(jīng)為該會(huì)話緩存了身份驗(yàn)證信息,就有可能出現(xiàn)這樣的情況:一個(gè)客戶端可以使用另一個(gè)客戶端的緩存憑據(jù),從而通過模擬其他用戶獲得未經(jīng)授予的訪問權(quán)限。
除了要考慮技術(shù)問題以外,您還必須考慮這樣一種設(shè)計(jì)在許可方面的可行性。目前的許可原則禁止在服務(wù)器上使用“Office 應(yīng)用程序”為客戶端請(qǐng)求提供服務(wù),除非那些客戶端自己具有 Office 的許可副本。《最終用戶許可協(xié)議》(EULA) 沒有涉及使用服務(wù)器端“自動(dòng)化”向未經(jīng)許可的工作站提供 Office 功能的情況。
但是按模板生成word/excel是一個(gè)很頻繁的需求,這個(gè)功能非常常用,又實(shí)用.暫時(shí)也沒時(shí)間找替代方案,只好找辦法解決權(quán)限問題.
繼續(xù)Google,發(fā)現(xiàn)可以通過DCOM配置的方式.其做法都是將DCOM配置中的Excel運(yùn)行賬戶添加到安全選項(xiàng)卡下的"啟動(dòng)和激活","訪問","配置"中.
這里將為IIS App Pool配置的運(yùn)行賬戶提交到這3個(gè)選項(xiàng)中.
PS:發(fā)現(xiàn)權(quán)限中沒有管理組的賬號(hào),導(dǎo)致一個(gè)問題,asp.net能正常運(yùn)行excel,但是直接在左面上無法打開,報(bào)錯(cuò)"無法嵌入對(duì)象".
安全介紹:
項(xiàng)目 詳細(xì)信息
啟動(dòng)和激活權(quán)限
單擊以下選項(xiàng)按鈕之一:
使用默認(rèn)值:?jiǎn)螕舸税粹o以指定應(yīng)用程序使用在計(jì)算機(jī)屬性頁(yè)的“COM 安全”選項(xiàng)卡上設(shè)置的默認(rèn)權(quán)限。
自定義:?jiǎn)螕舸税粹o以指定應(yīng)用程序使用您設(shè)置的權(quán)限。若要更改權(quán)限,請(qǐng)單擊“編輯”。
訪問權(quán)限
單擊以下選項(xiàng)按鈕之一:
使用默認(rèn)值:?jiǎn)螕舸税粹o以指定應(yīng)用程序使用在計(jì)算機(jī)屬性頁(yè)面的“COM 安全”選項(xiàng)卡上設(shè)置的默認(rèn)權(quán)限。
自定義:?jiǎn)螕舸税粹o以指定應(yīng)用程序使用您設(shè)置的權(quán)限。若要更改權(quán)限,請(qǐng)單擊“編輯”。
配置權(quán)限
單擊以下選項(xiàng)按鈕之一:
使用默認(rèn)值:?jiǎn)螕舸税粹o以指定應(yīng)用程序使用默認(rèn)的注冊(cè)表配置權(quán)限。
自定義:?jiǎn)螕舸税粹o以指定應(yīng)用程序使用您設(shè)置的注冊(cè)表配置權(quán)限。若要更改權(quán)限,請(qǐng)單擊“編輯”。
在標(biāo)識(shí)中"交互式","啟動(dòng)","特定"到底應(yīng)該怎樣選擇呢?其實(shí)通過MS的文檔,可以很容易理解.
asp.net啟動(dòng)的情況,適合于"啟動(dòng)用戶".
PS:注意安全策略.
標(biāo)識(shí)介紹:
“交互式用戶”選項(xiàng)按鈕
單擊以指定應(yīng)用程序在當(dāng)前已登錄該計(jì)算機(jī)的用戶身份下運(yùn)行。對(duì)應(yīng)用程序進(jìn)行身份驗(yàn)證以訪問資源時(shí)將使用此用戶的安全憑據(jù)。
“啟動(dòng)用戶”選項(xiàng)按鈕
單擊以指定應(yīng)用程序使用已啟動(dòng)該應(yīng)用程序的用戶(啟動(dòng)用戶)的安全上下文運(yùn)行,以便可以在域中對(duì)該應(yīng)用程序進(jìn)行身份驗(yàn)證。啟動(dòng)用戶可以是交互式用戶。
“下列用戶”選項(xiàng)按鈕
單擊以指定應(yīng)用程序使用指定用戶帳戶的安全上下文運(yùn)行,以便可以在域中對(duì)該應(yīng)用程序進(jìn)行身份驗(yàn)證。鍵入用戶名和密碼。
“系統(tǒng)帳戶”選項(xiàng)按鈕
單擊以指定服務(wù)器應(yīng)用程序使用內(nèi)置系統(tǒng)帳戶的安全上下文運(yùn)行。此選項(xiàng)僅對(duì)作為服務(wù)安裝的應(yīng)用程序可用。
|
|