【转】Asp.Net中Excel操作权限的问题
近日在打開(kāi)原來(lái)寫(xiě)的一個(gè)網(wǎng)頁(yè)程序運(yùn)行時(shí),出現(xiàn)了Excel操作權(quán)限的問(wèn)題,具體的說(shuō)就是在代碼中調(diào)用下面這段與Excel操作有關(guān)的語(yǔ)句時(shí)
Application curExcelApp = new ApplicationClass();
提示權(quán)限不足,具體的提示內(nèi)容如下:
檢索 COM 類(lèi)工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時(shí)失敗,原因是出現(xiàn)以下錯(cuò)誤: 80070005。
說(shuō)明: 執(zhí)行當(dāng)前 Web 請(qǐng)求期間,出現(xiàn)未處理的異常。請(qǐng)檢查堆棧跟蹤信息,以了解有關(guān)該錯(cuò)誤以及代碼中導(dǎo)致錯(cuò)誤的出處的詳細(xì)信息。 異常詳細(xì)信息: System.UnauthorizedAccessException: 檢索 COM 類(lèi)工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時(shí)失敗,原因是出現(xiàn)以下錯(cuò)誤: 80070005。 ASP.NET 未被授權(quán)訪問(wèn)所請(qǐng)求的資源。請(qǐng)考慮授予 ASP.NET 請(qǐng)求標(biāo)識(shí)訪問(wèn)此資源的權(quán)限。ASP.NET 有一個(gè)在應(yīng)用程序沒(méi)有模擬時(shí)使用的基進(jìn)程標(biāo)識(shí)(通常,在 IIS 5 上為 {MACHINE}\ASPNET,在 IIS 6 上為網(wǎng)絡(luò)服務(wù))。如果應(yīng)用程序正在通過(guò) <identity impersonate="true"/> 模擬,則標(biāo)識(shí)將為匿名用戶(hù)(通常為 IUSR_MACHINENAME)或經(jīng)過(guò)身份驗(yàn)證的請(qǐng)求用戶(hù)。 要將 ASP.NET 訪問(wèn)權(quán)限授予某個(gè)文件,請(qǐng)?jiān)谫Y源管理器中右擊該文件,選擇“屬性”,然后選擇“安全”選項(xiàng)卡。單擊“添加”添加適當(dāng)?shù)挠脩?hù)或組。突出顯示 ASP.NET 帳戶(hù),選中所需訪問(wèn)權(quán)限對(duì)應(yīng)的框。
?
源錯(cuò)誤:
? //創(chuàng)建Excel信息?
object?missing?=?System.Reflection.Missing.Value;
Application?curExcelApp?=?new?ApplicationClass();
curExcelApp.Application.DisplayAlerts?=?false;
Workbook?curWorkBook?=?curExcelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
?
原來(lái)碰到過(guò)這種情況,知道是由于Excel的DCom組件權(quán)限不足所引起的,所以按照原來(lái)的步驟進(jìn)行設(shè)置,如下所示:?
??????? 1:在服務(wù)器上安裝office的Excel軟件;?
??????? 2:在"開(kāi)始"->"運(yùn)行"中輸入dcomcnfg.exe啟動(dòng)"組件服務(wù)";
??????? 3:依次雙擊"組件服務(wù)"->"計(jì)算機(jī)"->"我的電腦"->"DCOM配置";?
??????? 4:在"DCOM配置"中找到"Microsoft Excel 應(yīng)用程序",在它上面點(diǎn)擊右鍵,然后點(diǎn)擊"屬性",彈出"Microsoft Excel 應(yīng)用程序?qū)傩?#34;對(duì)話框;?
??????? 5:點(diǎn)擊"標(biāo)識(shí)"標(biāo)簽,選擇"交互式用戶(hù)";?
??????? 6:點(diǎn)擊"安全"標(biāo)簽,在"啟動(dòng)和激活權(quán)限"上點(diǎn)擊"自定義",然后點(diǎn)擊對(duì)應(yīng)的"編輯"按鈕,在彈出的"安全性"對(duì)話框中填加一個(gè)"NETWORK SERVICE"用戶(hù)(注意要選擇本計(jì)算機(jī)名),并給它賦予"本地啟動(dòng)"和"本地激活"權(quán)限。在XP系統(tǒng)和2000系統(tǒng)中添加ASPNET用戶(hù);
??????? 7:依然是"安全"標(biāo)簽,在"訪問(wèn)權(quán)限"上點(diǎn)擊"自定義",然后點(diǎn)擊"編輯",在彈出的"安全性"對(duì)話框中也填加一個(gè)"NETWORK SERVICE"用戶(hù),然后賦予"本地訪問(wèn)"權(quán)限.?
??????? 注意:其中第5步是必須的,否則會(huì)出現(xiàn)以下錯(cuò)誤:?
??????? 內(nèi)存或磁盤(pán)空間不足,Microsoft Office Excel 無(wú)法再次打開(kāi)或保存任何文檔。 ? 要想獲得更多的可用內(nèi)存,請(qǐng)關(guān)閉不再使用的工作簿或程序。 ? 要想釋放磁盤(pán)空間,請(qǐng)刪除相應(yīng)磁盤(pán)上不需要的文件。
?
說(shuō)明: 執(zhí)行當(dāng)前 Web 請(qǐng)求期間,出現(xiàn)未處理的異常。請(qǐng)檢查堆棧跟蹤信息,以了解有關(guān)該錯(cuò)誤以及代碼中導(dǎo)致錯(cuò)誤的出處的詳細(xì)信息。 異常詳細(xì)信息: System.Runtime.InteropServices.COMException: 內(nèi)存或磁盤(pán)空間不足,Microsoft Office Excel 無(wú)法再次打開(kāi)或保存任何文檔。 ? 要想獲得更多的可用內(nèi)存,請(qǐng)關(guān)閉不再使用的工作簿或程序。 ? 要想釋放磁盤(pán)空間,請(qǐng)刪除相應(yīng)磁盤(pán)上不需要的文件。
?
?
源錯(cuò)誤:?Application?curExcelApp?=?new?ApplicationClass();
curExcelApp.Application.DisplayAlerts?=?false;
Workbook?curWorkBook?=?curExcelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet?curWorkSheet?=?(Worksheet)curWorkBook.Sheets.get_Item(1);
?
?
按照上述步驟設(shè)置好了以后,重新執(zhí)行程序,還是出現(xiàn)權(quán)限不足的問(wèn)題,問(wèn)題不知道出現(xiàn)在什么地方,仔細(xì)分析提示信息和代碼,終于發(fā)現(xiàn)了問(wèn)題的所在,原來(lái)是在Web.config中進(jìn)行了下面的設(shè)置:
??????? <identity impersonate="true"/>?
??????? 而這段話的目的是為每一個(gè)請(qǐng)求進(jìn)行客戶(hù)端模擬,按照提示信息中的解釋,由于沒(méi)有設(shè)置Username,所以當(dāng)前執(zhí)行的用戶(hù)是IUSR_MACHINENAME,而該用戶(hù)是沒(méi)有操作Excel組件的權(quán)限,為了驗(yàn)證分析是否正確,進(jìn)行了一下驗(yàn)證:?
??????? 將這句話刪除,執(zhí)行程序,一切正常;?
??????? 在Excel的操作權(quán)限中加入當(dāng)前登陸的用戶(hù),并進(jìn)行如下的設(shè)置:<identity impersonate="true" userName="***" password="***"/>,執(zhí)行程序,一切正常;?
??????? 在Excel的操作權(quán)限中加入所有的用戶(hù),并進(jìn)行如下的設(shè)置:<identity impersonate="true"/>,執(zhí)行程序,出現(xiàn)權(quán)限不足的錯(cuò)誤。?
??????? 通過(guò)以上的驗(yàn)證,我們可以得出,在不進(jìn)行客戶(hù)端模擬設(shè)置時(shí),asp.net程序調(diào)用excel組件時(shí)使用的是network service用戶(hù)(在xp和2000中,使用的是aspnet用戶(hù)),使用設(shè)置<identity impersonate="true"/>進(jìn)行客戶(hù)端模擬時(shí),使用的是IUSR_MACHINENAME用戶(hù),但該用戶(hù)沒(méi)有調(diào)用excel組件的權(quán)限,即使設(shè)置了該用戶(hù)的相關(guān)權(quán)限也不行;使用設(shè)置<identity impersonate="true" userName="***" password="***"/>進(jìn)行客戶(hù)端模擬時(shí),只要設(shè)置了相關(guān)用戶(hù)的權(quán)限,就可以順利地調(diào)用Excel組件,但是要注意的是:由于asp.net的限制,該用戶(hù)的密碼不能為空。?
??????? 在處理該問(wèn)題時(shí),在網(wǎng)上找到了一個(gè)比較有用的資料,與大家分享如下:?
??????? 解決部署在Window Server 2003 上Excel.exe進(jìn)程問(wèn)題
??????? 在操作完Excel以后,每次就會(huì)留下一個(gè)Execl.exe進(jìn)程,無(wú)論如何也關(guān)閉不了,包括用垃圾回收等,原因我也不知道,但是在其他服務(wù)器操作系統(tǒng)和xp操作系統(tǒng)上不存在這種問(wèn)題。
?
??????? 解決此類(lèi)問(wèn)題,有一個(gè)方法可以借鑒,就是殺死進(jìn)程的方法,但是有一定的風(fēng)險(xiǎn),要注意,具體方法如下:?
??????? 操作進(jìn)程有一定的風(fēng)險(xiǎn),所有首先要有此類(lèi)權(quán)限,添加權(quán)限方法,在web.Config里面添加權(quán)限<identity? impersonate="true"?? userName="登錄名"?? password="密碼 "/>
?
? 殺死進(jìn)程方法??????????publicstaticvoid?KillProcess(string?processName)
????????{
????????????System.Diagnostics.Process?myproc?=?new?System.Diagnostics.Process();
????????????//得到所有打開(kāi)的進(jìn)程
????????????try
????????????{
????????????????foreach?(Process?thisproc?in?Process.GetProcessesByName(processName))
????????????????{
????????????????????if?(!thisproc.CloseMainWindow())?
????????????????????{
????????????????????????if(thisproc!=null)
????????????????????????thisproc.Kill();
????????????????????}
????????????????}
????????????}
????????????catch?(Exception?Exc)
????????????{
????????????????throw?Exc;
????????????}?
????????}?
?
在操作完Excel后,調(diào)用殺死進(jìn)程方法就可以了,下一次就會(huì)正常調(diào)用。
?
殺死進(jìn)程請(qǐng)參看http://www.cnblogs.com/leic2000/articles/1269122.html
轉(zhuǎn)載于:https://www.cnblogs.com/leic2000/archive/2008/08/18/1270058.html
總結(jié)
以上是生活随笔為你收集整理的【转】Asp.Net中Excel操作权限的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么是SQA?
- 下一篇: PBX与VoIP:它们之间有什么区别?