關於COM類工廠80070005和8000401a錯誤分析及解決辦法(DCOM)
關於COM類工廠80070005和8000401a錯誤分析及解決辦法
問題描述:最近做一個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 上為網路服務)。如果應用程式正在通過 <identity impersonate="true"/> 模擬,則標識將為匿名使用者(通常為IUSR_MACHINENAME)或經過身份驗證的請求使用者。
問題分析:
在異常詳細資訊裡提到“模擬”,“network service使用者”和“匿名使用者”,那就首先分析一下這些概念含義。
(一) Web.Config配置
1、身份模擬(identity impersonate),這是很關鍵的一句,表示web應用將為每一個請求進行客戶端模擬,就是使用一個指定的賬戶身份訪問web應用。
在不進行客戶端模擬設定時,asp.net程式呼叫excel元件時使用的是network service使用者(在xp和2000中,使用的是aspnet使用者)使用設定<identity impersonate="true"/>進行客戶端模擬時,預設使用的是IUSR_MACHINENAME使用者,但該使用者沒有呼叫excel元件的許可權。設定客戶端模擬還可以使用指定的使用者,將會以此使用者的身份訪問web應用,但是要注意的是:由於asp.net的限制,該使用者的密碼不能為空。如下所示:
<identity impersonate="true" userName="伺服器上系統使用者名稱" password="使用者密碼"/>
2、身份驗證(authentication), 通過 <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檔案中設定使用身份模擬,形式<identity impersonate="true" />或者<identityimpersonate="true" userName="IUSR_ZZUDEV01-VM2" password="密碼"/>
實驗結果:能正常訪問web應用,但訪問excel檔案被拒絕
【試驗六】
DCOM設定使用“啟動使用者”後,身份驗證級別選擇“預設”,安全選項卡中“啟動和啟用”中選擇自定義並加入administrator使用者和network service使用者並賦予最大許可權, “訪問許可權”選擇自定義並加入network service使用者並賦予最大許可權, “配置許可權”中選擇自定義並加入administrator使用者和network service使用者並賦予最大許可權,IIS的“目錄安全性”中按預設設定,但web.config檔案中設定使用身份模擬,形式<identity impersonate="true" />或者<identity impersonate="true" userName="IUSR_ZZUDEV01-VM2" password="密碼"/>
實驗結果:能正常訪問web應用,但訪問excel檔案被拒絕
【試驗七】
DCOM設定使用“啟動使用者”後,身份驗證級別選擇“預設”,安全選項卡中“啟動和啟用”中選擇自定義並加入administrator使用者和network service使用者並賦予最大許可權, “訪問許可權”中選擇“使用預設值”,即兩個使用者都不加, “配置許可權”中選擇自定義並加入administrator使用者和network service使用者並賦予最大許可權, IIS的“目錄安全性”中按預設設定,但web.config檔案中設定使用身份模擬,形式<identity impersonate="true" />或者<identityimpersonate="true" userName="IUSR_ZZUDEV01-VM2" password="密碼"/>
實驗結果:能正常訪問web應用,也能訪問excel檔案,但無法建立excel例項,報com類工廠錯80070005
【試驗八】
DCOM設定使用“啟動使用者”後,身份驗證級別選擇“預設”,安全選項卡中“啟動和啟用”中選擇自定義並加入administrator使用者和network service使用者並賦予最大許可權, “訪問許可權”中選擇“使用預設值”,即兩個使用者都不加, “配置許可權”中選擇自定義並加入administrator使用者和network service使用者並賦予最大許可權, IIS的“目錄安全性”中按預設設定,但web.config檔案中設定使用administrator身份模擬,即<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應用。
網上參考資料:
2、 請教IUSR_MachineName與NetworkService/ASPNET 兩個賬戶之間的關係