关于COM类工厂80070005和8000401a错误分析及解决办法
檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件失敗,原因是出現以下錯誤: 8000401a 因為配置類型不正確,系統無法開始服務器進程。請檢查用戶名和密碼。 (異常來自 HRESULT:80070005)
檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件失敗,原因是出現以下錯誤: 8000401a 因為配置類型不正確,系統無法開始服務器進程。請檢查用戶名和密碼。 (異常來自 HRESULT:0x8000401A)問題描述:最近做一個web應用程序需要操作Excel文件,在開發環境下程序測試正常,部署到IIS后程序操作Excel文件,IIS報錯,錯誤出現在創建Excel進程的語句,如下:
Application?myExcelApp =?new?ApplicationClass();?
IIS提示信息如下:
檢索?COM?類工廠中?CLSID?為?{00024500-0000-0000-C000-000000000046}?的組件時失敗,原因是出現以下錯誤: 80070005。
?
異常詳細信息:??ASP.NET?未被授權訪問所請求的資源。請考慮授予?ASP.NET?請求標識訪問此資源的權限。ASP.NET?有一個在應用程序沒有模擬時使用的基進程標識(通常,在?IIS 5?上為?{MACHINE}/ASPNET,在?IIS 6?上為網絡服務)。如果應用程序正在通過??模擬,則標識將為匿名用戶(通常為IUSR_MACHINENAME)或經過身份驗證的請求用戶。?
?
問題分析:
在異常詳細信息里提到“模擬”,“network??service用戶”和“匿名用戶”,那就首先分析一下這些概念含義。
(一)???Web.Config配置
1、身份模擬(identity impersonate),這是很關鍵的一句,表示web應用將為每一個請求進行客戶端模擬,就是使用一個指定的賬戶身份訪問web應用。
在不進行客戶端模擬設置時,asp.net程序調用excel組件時使用的是network service用戶(在xp和2000中,使用的是aspnet用戶)使用設置進行客戶端模擬時,默認使用的是IUSR_MACHINENAME用戶,但該用戶沒有調用excel組件的權限。設置客戶端模擬還可以使用指定的用戶,將會以此用戶的身份訪問web應用,但是要注意的是:由于asp.net的限制,該用戶的密碼不能為空。如下所示:
<identity?impersonate="true"?userName="服務器上系統用戶名"?password="用戶密碼"/>
?
2、身份驗證(authentication),?通過??節可以配置?ASP.NET?使用的?安全身份驗證模式,以標識傳入的用戶。Mode選擇Windows,表示使用Windows集成的身份驗證模式。
<authentication?mode="Windows"/>
?
?????????實際上以上兩處配置與IIS的“目錄安全性”配置相對應,若在IIS中已做配置后,Web.config里可不再設置,通常創建IIS虛擬目錄時,默認會配置使用客戶端模擬,模擬身份是“匿名用戶”即IUSR_MACHINENAME(在xp和2000中,使用的是aspnet用戶)。如下圖所示:
?
(二)???Network Service系統用戶
在安裝IIS后,系統上會有三個值得我們關注的用戶,分別是aspnet、iusr_machinename、iwam_machinename,如下圖所示:
在IIS 5中,asp.net應用程序通過ASPNET用戶訪問,在IIS 6/7中,ASPNET賬戶被替換成Network Service,asp.net?應用程序需要以“Network Service”?進程標識運行來訪問,這個進程標識對應兩個賬戶:IUSR_MACHINENAME和IWAM_MACHINENAME,其作用見上圖。而其ASP.NET程序能訪問的資源都是受Network Service限制的,這個賬戶能訪問什么資源,ASP.NET程序才能訪問資源。
Network Service賬戶只擁有本機部分權限,它能夠以計算機的名義訪問網絡資源,還有認證用戶有權限訪問的資源。
?
綜上所述,我們只用在IIS里使用“匿名用戶”即以“network service”進程標識就可以訪問web應用,無需再配置web.config文件。但是無法創建Excel實例,說明network service進程標識的權限不夠,如何給他授權在服務器上創建Excel實例呢?
?
(三)??DCOM組件配置
在服務器上操作excel要調用com組件,因此對network service的授權需要配置excel應用程序com組件。
1、?打開Excel應用程序COM組件
方法:在"開始"->"運行"中輸入dcomcnfg.exe啟動"組件服務";?依次雙擊"組件服務"->"計算機"->"我的電腦"->"DCOM配置";?在"DCOM配置"中找到"Microsoft Excel?應用程序",在它上面點擊右鍵,然后點擊"屬性",彈出"Microsoft Excel?應用程序屬性"對話框。如下圖所示:
?
2、?配置EXCEL相關COM組件
需要注意的是在筆者的服務器上Excel相關的com組件有2個,分別是:Microsoft Excel應用程序和Microsoft office Excel 2007工作薄,必須同時對這兩個com組件做相同的配置,否則仍然會出現無法創建Excel實例的現象。
配置方法:
“常規”選項卡中“身份驗證級別”選擇“默認”;
“安全”選項卡中,啟動和激活”、“訪問權限”和“配置權限”全部選擇“自定義”,添加“network service”用戶并賦予最大權限。
“標識”選項卡中,選擇“啟動用戶”,最后點擊確認。
如下圖所示:
?
經過這樣配置以后,web應用能夠成功訪問,Excel實例也能夠正常創建,COM類工廠錯誤80070005成功解決!
這里我做了一個實驗,若“標識”中選擇的是“交互式用戶”,則web應用能夠成功訪問,但不能創建Excel實例,此時COM類工廠報告另外一個錯誤8000401a,如下圖所示:
??????????????這里有必要說一下“交互式用戶”與“啟動用戶”的區別:
| 交互式用戶 (The interactive user) | 這是推薦的選項,?以當前登錄到系統的用戶確定對象的身份(當前必須有用戶登錄到系統,?如果用戶注銷那么對象也會被銷毀) |
| 啟動用戶 (The launching user) | 以調用的客戶端的用戶確定對象的身份,?一個缺點就是這個對象不能再進行遠程調用 |
?
??????????????為什么選擇“交互式用戶”會出現8000401a錯誤呢??原因是使用的身份不對,因為此時我使用administrator登錄服務器,所以交互式用戶就是administrator,如果選擇的是“啟動用戶”,將以調用的客戶端的用戶確定對象身份,客戶端所使用的是“匿名賬戶IUSR_MACHINENAME”,調用它的是network service進程標識。我們在前面配置DCOM時已經賦予network service相應權限,但沒有給administrator授權,那是不是給administrator授權后選擇交互式用戶就可以創建excel實例了呢?
??????????????應此,我按這個思路做了五組實驗:
【試驗一】
DCOM設置使用“交互式用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入administrator用戶(因為當前使用的登錄用戶是administrator)并賦予最大權限,IIS目錄安全性中按默認設置
實驗結果:能正常訪問web應用,但不能操作excel,報?COM?類工廠錯誤代碼?8000401a
?
【實驗二】
DCOM設置使用“交互式用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入administrator用戶(因為當前使用的登錄用戶是administrator)并賦予最大權限,IIS目錄安全性中按默認設置,但web.config文件中設置使用administrator身份模擬
實驗結果:能正常訪問web應用,但不能操作excel,報?COM?類工廠錯誤代碼?8000401a
?
【實驗三】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入administrator用戶(因為當前使用的登錄用戶是administrator)并賦予最大權限,IIS目錄安全性中按默認設置,但web.config文件中設置使用administrator身份模擬
實驗結果:能正常訪問web應用,能正常創建excel實例
?
【實驗四】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入administrator用戶(因為當前使用的登錄用戶是administrator)并賦予最大權限,IIS目錄安全性中按默認設置,但web.config文件中設置使用IUSR_MACHINENAME身份模擬
實驗結果:能正常訪問web應用,但不能操作excel,報?COM?類工廠錯誤代碼?8000401a
?
【實驗五】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入administrator用戶(因為當前使用的登錄用戶是administrator)并賦予最大權限,IIS目錄安全性中按默認設置,但web.config文件中不使用身份模擬
實驗結果:不能正常訪問web應用,也不能操作excel
?
?
上面五個實驗說明:在web.config中設置“身份模擬”只對DCOM中的?“啟動用戶”才有效,且欲操作Excel還必須在DCOM中賦予“身份模擬”的用戶最大權限。
為求徹底弄清楚問題的本質,我又做了幾組實驗:
【試驗一】
DCOM設置使用“交互式用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇“默認”,IIS目錄安全性中按默認設置,web.config文件中設置使用IUSR_MACHINENAME身份模擬
實驗結果:不能正常訪問web應用,也不能操作excel
?
【試驗二】
DCOM設置使用“交互式用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入network service用戶(此時已刪除administrator用戶)并賦予最大權限,IIS目錄安全性中按默認設置,web.config文件中設置使用IUSR_MACHINENAME身份模擬
實驗結果:不能正常訪問web應用,也不能操作excel
?
【試驗三】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇“默認”,IIS目錄安全性中按默認設置,但web.config文件中設置使用IUSR_MACHINENAME身份模擬
實驗結果:不能正常訪問web應用,也不能操作excel
?
【試驗四】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入network service用戶(此時已刪除administrator用戶)并賦予最大權限,IIS目錄安全性中按默認設置,?web.config文件不使用身份模擬配置
實驗結果:能正常訪問web應用,能正常創建excel實例
?
【試驗五】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”、“訪問權限”和“配置權限”全部選擇自定義,并且都加入network service用戶(此時已刪除administrator用戶)并賦予最大權限,IIS目錄安全性中按默認設置,但web.config文件中設置使用身份模擬,形式<</span>identity?impersonate="true"?/>或者<</span>identityimpersonate="true"?userName="IUSR_ZZUDEV01-VM2"?password="密碼"/>
實驗結果:能正常訪問web應用,但訪問excel文件被拒絕
?
【試驗六】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”中選擇自定義并加入administrator用戶和network service用戶并賦予最大權限,?“訪問權限”選擇自定義并加入network service用戶并賦予最大權限,?“配置權限”中選擇自定義并加入administrator用戶和network service用戶并賦予最大權限,IIS的“目錄安全性”中按默認設置,但web.config文件中設置使用身份模擬,形式<</span>identity?impersonate="true"?/>或者<</span>identity?impersonate="true"?userName="IUSR_ZZUDEV01-VM2"?password="密碼"/>
實驗結果:能正常訪問web應用,但訪問excel文件被拒絕
?
【試驗七】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”中選擇自定義并加入administrator用戶和network service用戶并賦予最大權限,?“訪問權限”中選擇“使用默認值”,即兩個用戶都不加,?“配置權限”中選擇自定義并加入administrator用戶和network service用戶并賦予最大權限,?IIS的“目錄安全性”中按默認設置,但web.config文件中設置使用身份模擬,形式<</span>identity?impersonate="true"?/>或者<</span>identityimpersonate="true"?userName="IUSR_ZZUDEV01-VM2"?password="密碼"/>
實驗結果:能正常訪問web應用,也能訪問excel文件,但無法創建excel實例,報com類工廠錯80070005
?
【試驗八】
DCOM設置使用“啟動用戶”后,身份驗證級別選擇“默認”,安全選項卡中“啟動和激活”中選擇自定義并加入administrator用戶和network service用戶并賦予最大權限,?“訪問權限”中選擇“使用默認值”,即兩個用戶都不加,?“配置權限”中選擇自定義并加入administrator用戶和network service用戶并賦予最大權限,?IIS的“目錄安全性”中按默認設置,但web.config文件中設置使用administrator身份模擬,即<</span>identity?impersonate="true"userName="administrator"?password="密碼"/>
實驗結果:能正常訪問web應用,能訪問excel文件,能正常創建excel實例
?
?
經過以上又進行的八組實驗說明,在IIS上部署操作Excel的web應用,需要涉及3方面的權限:第一個是訪問web應用的權限,第二個是訪問excel的權限,第三個是操作excel的權限。
使用“身份模擬”僅能達到訪問web應用的效果,還不能具有第二、第三的權限,要訪問、操作Excel必須配置DCOM組件,并選擇使用“啟動用戶”。IIS 6默認使用network service進程標識去調用默認的“匿名賬戶IUSR_MACHINENAME”來用訪問web應用,此時操作Excel的“啟動用戶”應該是network service進程標識,但注意不能將其具體到IUSR_MACHINENAME和IWAM_MACHINENAME用戶,通過實驗六可以也看出,在DCOM中的“啟動和激活”與“訪問權限”均配置添加network service用戶,web.config文件中使用具體的IUSR_MACHINENAME身份模擬訪問Excel文件被拒絕,說明默認匿名賬戶只有訪問web應用的權限,而不具有訪問Excel和操作Excel的權限。
訪問web應用,可以使用任何身份,IIS 6默認使用?IUSR_MACHINENAME用戶,當然也可以在web.config文件中或者IIS 6的“目錄安全性”中設置其他“身份模擬”。IUSR_MACHINENAME用戶不具有訪問Excel和操作Excel的權限,而只有Network Service具有訪問和操作Excel的權限。當DCOM中不配置“訪問權限”時,web.config中配置的“身份模擬”就充當兩種角色,一種是訪問web應用的角色,另一種是訪問Excel的角色,若在DCOM中給“身份模擬”的用戶授予“啟動和激活”的權限,則該用戶就具有了第三種角色,操作Excel。
最后,在補充一點:IIS的“目錄安全性”與web.config文件的“identity impersonate”進行“身份模擬”時優先級的問題
根據實驗個人判斷,web.config的“身份模擬”優先級較高,但IIS“目錄安全性”中的身份模擬為必有項(可根據情況選擇使用“匿名用戶訪問”或者“經身份驗證的用戶訪問”)。當兩者同時設置了不同的“身份模擬”時,將以web.config中的“身份模擬”訪問web應用。
?
網上參考資料:
1、?什么是?Network Service?http://homepage.yesky.com/73/2656073.shtml
2、?請教IUSR_MachineName與NetworkService/ASPNET?兩個賬戶之間的關系
http://topic.csdn.net/u/20100927/18/bc789782-3825-4a64-af0b-decbb479174e.html
3、asp操作excel權限不足的問題?http://www.wacxy.com/show.asp?id=1159
轉載于:https://www.cnblogs.com/jack-Star/p/4272264.html
總結
以上是生活随笔為你收集整理的关于COM类工厂80070005和8000401a错误分析及解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AB1562_UT软件分辨真假洛达156
- 下一篇: RS485/RS232通信协议