33

我刚刚创建了一个简单的应用程序并托管在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)
        {
            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.EXcelApplicaiton 设置完全权限/控制 3)在任务管理器中杀死所有 excel 实例

请在这方面帮助我,这只是示例应用程序,但在我的原始应用程序中主要是关于从/向 excel 读取和写入数据。

4

14 回答 14

52
  1. 确保在服务器上安装了 Office 运行时。
  2. 如果您使用的是 Windows Server 2008,那么使用 office interops 是一个冗长的配置,这里是步骤。

更好的是移动到 Open XML,或者您可以配置如下

  • 安装 MS Office Pro 最新版(我用的是 2010 Pro)
  • 创建用户 ExcelUser。为 WordUser 分配管理员组
  • 转到计算机 -> 管理
  • 使用以下选项添加用户
  • 用户选项密码永不过期
  • 密码不能更改

Com+ 配置

  • 转到控制面板 -> 管理员 -> 组件服务 -> DCOM 配置
  • 打开 Microsoft Word 97 - 2003 属性
  • 常规 -> 身份验证级别:无
  • 安全性 -> 自定义所有 3 个权限以允许所有人
  • 身份 -> 此用户 -> 使用 ExcelUser /password
  • 启动 Excel 应用程序以确保一切正常

3.在 DCOM Config 中更改 Microsoft Excel 应用程序的安全设置。

控制面板 --> 管理工具 --> 组件服务 --> 计算机 --> myComputer --> DCOM 配置 --> Microsoft Excel 应用程序。

右键单击以获取属性对话框。转到安全选项卡并自定义权限

请参阅此处的帖子:创建 Excel 对象时出错使用 COM 在 WCF 中进行 Excel 操作

于 2013-08-02T12:07:07.760 回答
41

有时,您创建了新的应用程序池,但无法通过 DCOMCNFG 解决。然后还有另一种方法:

将应用程序池的标识(模型名称)设置为LocalSystem

我不知道根本原因,但它一次解决了我的问题。

于 2014-03-13T15:08:36.423 回答
10

来不及回应。但是,如果这对仍然面临问题的人有所帮助。我通过以下方式解决了这个问题:

→ 将站点设置在专用池而不是共享池上。

→ 启用 32 位应用程序支持。

→ 将应用程序池的标识设置为 LocalSystem。

于 2016-05-16T03:16:41.403 回答
4
  1. 授予 IIS 用户或组用户读/写权限

  2. 开始 -> 运行 -> inetmgr

    为您的默认网站启用 ASP.NET 身份验证

3. 对于 64 位 (x64),创建此文件夹:C:\Windows\SysWOW64\config\systemprofile\Desktop

对于 32 位 (x86),创建此文件夹:C:\Windows\System32\config\systemprofile\Desktop

Windows 服务如果在系统配置文件下运行,则需要桌面文件夹。此文件夹是在 XP 和较旧的 Windows Server 版本上自动创建的,但不是为 Vista 和 Windows 2008 Server 创建的。

于 2013-07-22T11:57:40.897 回答
4

就个人而言,我运行了这些确切的步骤:

* 安装互操作程序集:您可以从 Microsoft 的网站安装https://www.microsoft.com/en-us/download/details.aspx?id=3508&tduid=(09cd06700e5e2553aa540650ec905f71)(256380)( 2459594)(TnL5HPStwNw-yuTjfb1FeDiXvvZxhh.RQ)()

* 检查组件版本:检查开发和生产机器上的组件版本。程序集将在 GAC 中,在 widows 7 中,此文件夹为 %windir%\assembly。

* 创建桌面文件夹:该服务使用 systemprofile 下的桌面文件夹,因此如果没有,您需要创建此文件夹,这里是文件夹的位置:对于 64 位应用程序:C:\Windows\SysWOW64\config\systemprofile\用于 32 位应用程序的桌面:C:\Windows\System32\config\systemprofile\Desktop

* 添加 DCOM 用户权限:
---启动运行窗口并输入“dcomcnfg”。
---展开组件服务 -> 计算机 -> 我的电脑 -> DCOM 配置。
---查找 Microsoft Excel 应用程序。右键单击它并选择属性,然后选择安全选项卡。
---选择“启动和激活权限”和“访问权限”下的自定义单选按钮,然后单击两者的编辑按钮以添加用户,如下所示。
---------单击添加按钮和用户'IIS_IUSRS'和'NETWORK SERVICE'并赋予他们完全权限。
---转到身份选项卡并选择“交互式用户”选项。
---点击应用和确定。

于 2016-02-26T00:24:56.017 回答
3

对我有用的解决方案是更改启动应用程序池的用户(ApplicationPoolIdentity 显然没有足够的权限来访问 COM 对象)。

祝你好运!

于 2013-09-20T08:59:27.740 回答
3

尝试执行以下操作:

  1. 确保已安装 Office 互操作程序集。
  2. 检查开发和生产中的程序集版本。
  3. 在 systemprofile 下创建 Desktop 文件夹。
  4. 为服务用户显式设置 DCOM 安全性。

你可以在这里找到更多细节

于 2014-01-27T05:06:53.380 回答
2

我刚刚创建了一个简单的应用程序

应用程序的目标处理器是什么?我猜它是x86- 所以要么将它设置为x64要么anycpu

我认为您遇到的问题是由于 64 位进程试图访问 32 位 dll。

此外,如果您无法更改目标处理器,您可以尝试从 IIS 的应用程序池设置中启用 32 位应用程序。

于 2013-08-06T21:41:14.183 回答
2

您在服务器上安装了 Excel 吗?您使用的互操作接口用于自动化Excel,这需要在其中安装 Excel 应用程序。每个页面请求周期都可能会启动一个单独的 excel.exe 实例。我强烈建议不要将此作为 Web 应用程序的一部分。

你为什么要这样做?如果您想要生成 Excel 文档,有很多更好的方法可以做到这一点,包括本线程其他地方提到的 OpenXML。请不要在服务器上运行 Excel!

OpenXML SDK 下载链接:http: //www.microsoft.com/en-us/download/details.aspx?id= 5124

于 2013-08-07T00:40:32.257 回答
1

这看起来像一个权限问题。我建议运行 processMonitor 以确定需要哪些权限。

于 2013-08-06T20:50:03.453 回答
1

使用NPOI读写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));
        }
    }
}  

看到这个Stackoverflow 问题

于 2013-08-07T04:57:03.847 回答
1

两天前遇到这个问题,花了整整两天时间,所以我发现我需要在 DCOMCNFG --> 我的电脑属性 --> Com Security --> Launch and Activation Permissions --> 授予对 IUSR 用户组的访问权限 -- > 编辑默认设置并将所有权利授予 IUSR。

希望它会帮助某人....

于 2017-04-07T05:18:18.810 回答
0

用这个

在管理员组中创建一个用户

在 Web 配置中添加此用户详细信息,如下所示

<system.web>
   <identity impersonate="true"
    userName="User Name"
    password="Password" />
    `enter code here`</system.web>

重新启动 IIS 并再次检查

-托尼-

于 2013-12-10T13:26:58.307 回答
0

如果您尝试在 64 位上进行配置,则必须在以下位置进行 DCOMconfig 配置(请参阅上面的其他答案):

C:\WINDOWS\SysWOW64>mmc comexp.msc /32

根据使用 DCOMCNFG 设置进程范围的安全性

在此之后,我可以在IIS_IUSRS没有管理员权限的情况下进行配置。

于 2021-01-26T17:32:03.237 回答