c# 調用EXCEL在VS上能正常運行,部署在IIS上不能實現,在VS中運行頁面和發布之后在IIS中運行的區別


發現一篇文章,很好,解決了這個問題;感謝原博主!特此做個筆記。

地址:http://www.cnblogs.com/zhongxinWang/p/3275154.html

發布在IIS上的Web程序,調用服務器的COM組件

  場景大致是這樣的,在工廠中分布着許多的PDA點,這些PDA點都要進行實時的掃描--打印操作。實現方法是采用網絡打印機,然后服務器安裝驅動,管理着所有的打印機。然后服務器,發布一個WebService,給每個PDA上的程序進行調用,PDA在要進行打印的時候,就掉用這個服務,傳遞相應參數,給服務器,然后由服務器去選擇打印機(當然是PDA想要的那個打印機了)。

  另外服務器選擇打印機進行打印的時候,要調用BarTender進行打印,這個時候,發布在IIS上的Web程序訪問COM會出現錯誤,就像網上流傳的訪問Excel、Word之類的一樣。

  感謝下面的博主。

  轉:http://blog.csdn.net/yangtze_nancy/article/details/5933634

  問題描述:最近做一個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后,系統上會有三個值得我們關注的用戶,分別是aspnetiusr_machinenameiwam_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應用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM