Asp.net &引用;正在检索组件的COM类工厂。。。。错误:80070005访问被拒绝。”;(HRESULT异常:0x80070005(E_访问被拒绝))
我刚刚创建了一个简单的应用程序,并托管在IIS6.0中。在代码中,我只是实例化excel对象Asp.net &引用;正在检索组件的COM类工厂。。。。错误:80070005访问被拒绝。”;(HRESULT异常:0x80070005(E_访问被拒绝)),asp.net,excel,iis,Asp.net,Excel,Iis,我刚刚创建了一个简单的应用程序,并托管在IIS6.0中。在代码中,我只是实例化excel对象 using excel = Microsoft.Office.Interop.Excel.Application; namespace TestHosting { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e
using excel = Microsoft.Office.Interop.Excel.Application;
namespace TestHosting
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
excel excelObj=new Microsoft.Office.Interop.Excel.Application();
}
}
}
这给了我以下的错误
"Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied." (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
系统配置:
Windows server 2008,64位企业版。
服务包2
我尝试了在互联网上找到的许多可能的解决方案,但没有一个对我有效
下面是我尝试过的一些解决方案
1)在路径“C:\Windows\SysWOW64\config\systemprofile”下创建桌面应用程序
2) 在DCOMCNFG中设置Microsfot.ExcelApplication的完全权限/控制
3) 在任务管理器中删除所有excel实例
请在这方面帮助我,这只是一个示例应用程序,但在我的原始应用程序中主要是关于从excel读取和写入数据
- 安装MS Office Pro最新版本(我使用的是2010 Pro)
- 创建用户ExcelUser。将WordUser分配给管理员组
- 进入计算机->管理
- 使用以下选项添加用户
- 用户选项密码永不过期
- 无法更改密码
- 转到控制面板->管理员->组件服务->DCOM配置
- 打开Microsoft Word 97-2003属性
- 常规->身份验证级别:无
- 安全->自定义所有3个权限以允许所有人
- 标识->此用户->使用Excel用户/密码
- 启动Excel应用程序以确保一切正常
请参阅此处的帖子:,这看起来像是权限问题。我建议运行processMonitor来确定需要哪些权限 我刚刚创建了一个简单的应用程序 应用程序的目标处理器是什么?我猜它是
x86
——所以要么将它设置为x64
或者anycpu
我认为您遇到的问题是由于64位进程试图访问32位dll
此外,如果无法更改目标处理器,可以尝试从IIS中的应用程序池设置启用32位应用程序。服务器上是否安装了Excel?您正在使用的互操作界面用于自动化Excel,这需要安装Excel应用程序。每个页面请求周期可能会启动一个单独的excel.exe实例。我强烈建议不要将此作为web应用程序的一部分 你为什么要这样做?如果您想生成Excel文档,有更好的方法,包括本线程其他地方提到的OpenXML。请不要在服务器上运行Excel 链接到OpenXML SDK下载:用于读取和写入excel。它是免费的、开源的 例如
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
//.....
private void button1_Click(object sender, EventArgs e)
{
HSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"c:\test.xls", FileMode.Open, FileAccess.Read))
{
hssfwb= new HSSFWorkbook(file);
}
ISheet sheet = hssfwb.GetSheet("Arkusz1");
for (int row = 0; row <= sheet.LastRowNum; row++)
{
if (sheet.GetRow(row) != null) //null is when the row only contains empty cells
{
MessageBox.Show(string.Format("Row {0} = {1}", row, sheet.GetRow(row).GetCell(0).StringCellValue));
}
}
}
使用NPOI.HSSF.UserModel;
使用NPOI.SS.UserModel;
//.....
私有无效按钮1\u单击(对象发送者,事件参数e)
{
HSSFW工作手册hssfwb;
使用(FileStream file=newfilestream(@“c:\test.xls”、FileMode.Open、FileAccess.Read))
{
hssfwb=新的HSSFW工作手册(文件);
}
ISHET表=hssfwb.GetSheet(“Arkusz1”);
对于(int row=0;row我的解决方案是更改启动应用程序池的用户(ApplicationPoolIdentity显然没有足够的权限访问COM对象)
祝你好运!用这个
在管理组中创建用户
在web配置中添加此用户详细信息,如下所示
`在这里输入代码`
重新启动IIS并再次检查
-tony-尝试执行以下操作:
确保已安装Office互操作程序集
在开发和生产时检查程序集的版本
在systemprofile下创建桌面文件夹
为服务用户显式设置DCOM安全性
您可以找到更多详细信息有时,您创建了新的应用程序池,但无法通过DCOMCNFG解决。然后还有另一种方法可以执行:
将应用程序池的标识(型号名称)设置为LocalSystem
我不知道根本原因,但它解决了我的问题一次。就我个人而言,我执行了以下确切步骤:
*安装互操作程序集:您可以从Microsoft网站安装
*检查程序集版本:检查开发和生产计算机上程序集的版本。程序集将位于GAC中,在widows 7中,此文件夹为%windir%\assembly。
*创建桌面文件夹:服务使用systemprofile下的桌面文件夹,因此您需要创建此文件夹(如果不存在),以下是文件夹的位置:
对于64位应用程序:C:\Windows\SysWOW64\config\systemprofile\Desktop
32
<system.web>
<identity impersonate="true"
userName="User Name"
password="Password" />
`enter code here`</system.web>
C:\WINDOWS\SysWOW64>mmc comexp.msc /32