通过 asp.net 访问 Office Word 对象模型导致“由于以下错误而失败:80070005 访问被拒绝”。

Posted

技术标签:

【中文标题】通过 asp.net 访问 Office Word 对象模型导致“由于以下错误而失败:80070005 访问被拒绝”。【英文标题】:Accessing Office Word object model through asp.net results in "failed due to the following error: 80070005 Access is denied." 【发布时间】:2011-03-29 11:19:06 【问题描述】:

我开发了一个网站,允许用户上传办公文档,然后使用办公对象模型将文档转换为 html 文件,然后在 iFrame 中显示。

当然,我已经包含了对 Office.interop.word 的引用,并且该站点在我的开发机器上运行良好。当我将它上传到我的生产服务器时,站点运行良好,直到我尝试上传文档。我最初收到一个类似的错误,上面写着“COM 对象未注册”。我意识到我的生产服务器上没有安装 Word。所以我安装了 word,现在 当服务器尝试访问 word 对象模型时,我收到以下错误:

检索 CLSID 为 000209FF-0000-0000-C000-000000000046 的组件的 COM 类工厂失败,原因是以下错误:80070005 访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))

我在注册表中搜索了对应的 CLSID 并找到了对应的文件夹。我向 IUSR_ 帐户添加了完全控制权,由于错误的持续存在,我最终向“所有人”添加了完全控制权,并确保这些权限继承到文件夹的其余部分。然后,我向 IUSR_ 添加了完全控制权,并最终再次向我的 microsoft office 文件夹中的“每个人”添加了完全控制权。

不知道要授予哪些其他权限以及在哪里才能消除此“访问被拒绝”错误。我一定是在错误的地方授予它们,因为就我知道我不能比“所有人”“完全控制”更宽容。

谁能解释一下?

【问题讨论】:

Microsoft 不支持这种对 Word 的使用。此外,可扩展性是可怕的。其他供应商提供了支持此方案的替代方案... 这是引发此异常的特定代码行: Dim wordApplication As New Microsoft.Office.Interop.Word.Application() 您能否详细说明“不支持使用 Word微软?”这似乎是一个笼统的声明。你的意思是不支持通过asp.net访问word对象模型?即便如此,我想弄清楚为什么会抛出这个异常。即使它不受支持,对象模型也会做我需要的事情,如果我能绕过这个错误的话。你能指出我提到的一些替代方案吗? 永远不要在 ASP.NET 应用程序中使用 Office Interop。见Considerations for server-side Automation of Office 【参考方案1】:

好的,我通过以下步骤解决了这个问题:

    在命令行中输入 DCOMCNFG 展开控制台根目录 > 组件服务 > 计算机,右键单击我的电脑,然后选择属性 在选项卡 COM 安全 > 启动和激活权限中单击编辑默认值 添加用户(例如 IIS_IUSRS)或服务 勾选允许本地启动和本地激活

然后Excel、Word等应用程序就可以工作了,祝你好运。

【讨论】:

我已经关注了这个。上面的错误被删除。 var objWord = new Microsoft.Office.Interop.Word.Application(); objWord.Documents.Open(FileName: htmlTemplateFile + @"\" + strFilename); objWord.Visible = false; if (objWord.Documents.Count > 0) 但现在我没有得到 objWord.Documents.Count >0 即使文档在那里。同样的事情适用于 Visual Studio 开发者服务器 哇!这在一年内救了我两次。谢谢你:) 这不是安全“不不不”吗?这是否允许对 IIS 执行任何 DCOM 组件?真正感兴趣,因为这是我克服类似问题的唯一方法 - 仅允许在特定 DCOM 组件上启动不起作用,如果我的电脑,我必须这样做。 安全——如果可能的话,我建议缩小特定包/应用程序的激活权限(参见 gyosifov 的回答***.com/a/26295661/3063884),最后只恢复到“授予一切权限”度假村。【参考方案2】:

这对我有用:

    在命令行中输入DCOMCNFG 组件服务 -> 计算机 -> 我的电脑 -> DCOM 配置 查找“Microsoft Word 97 - 2003 文档”(如果缺少,请检查您的 Word 是否也是 64 位(如果您的 Windows 是)如果它没有运行mmc comexp.msc /32 而不是Darkseal建议的步骤1中的DCOMCNFG here) 右键->属性 转到选项卡安全并编辑“自定义”单选按钮,以便 IIS_IUSRS 可以拥有启动和访问权限 转到标签标识并选择“交互式用户” 应用更改并重试 如果这一切都失败了,还请转到“常规”选项卡并在“身份验证级别”下拉菜单中选择“无”。

【讨论】:

如果你的安装是 64 位的怎么办? 对于在 64 位机器上运行的 32 位 COM 包,根据 Darkseal 的回答 (***.com/a/43736859/3063884),使用 mmc comexp.msc /32 运行 DCOMCNFG。 @gyosifov -- 请考虑在第 1 步中包含此信息。 @Villat 我不太确定,说实话我是偶然发现的。它与两个应用程序(word 和 iis 进程)之间的数据包安全有关。我怀疑windows的服务器版本通过抽象和分离进程来处理事情的不同策略。我找不到太多信息,但这里有两个链接:docs.microsoft.com/en-us/previous-versions/windows/it-pro/…docs.microsoft.com/en-us/windows/desktop/com/… 这可能是SO中最好的答案。你刚刚救了我的命。 @gman 对于 .net Web 应用程序,仅 IIS_IUSRS 就足够了。如果您有桌面应用程序 - 那么运行该应用程序的用户【参考方案3】:

查看安装 Word 的服务器计算机上的 Windows 日志、系统下的事件查看器。您是否看到记录的事件类似于:

机器默认权限 设置不授予本地激活 COM 服务器的权限 带有 CLSID 的应用程序 148BEE7F-6123-41EE-8CCA-E390902BD0D8 给用户 SomeMachine\SomeUser SID (S-1-5-21-483881670-2168941642-1987552629-1003)来自地址 LocalHost(使用 LRPC)。 此安全权限可以是 使用组件服务修改 管理工具。

如果是这样,请运行 DCOMCNFG.EXE,然后转到组件服务、计算机、我的电脑(或任何名称)、DCOM 配置(如果它询问您是否要修复任何东西,您可以回答“否”),如果事件日志消息是针对应用程序的,然后通过事件日志消息中的名称找到它,这里是项目名称,如果事件日志消息是针对 CLSID(如上面的示例),那么通过 CLSID "148B..." 找到它(这只是我粘贴的随机 CLSID - 可能它会匹配您上面的 000209FF...),然后选择更多操作...属性,到安全选项卡。

在这里,您可以选择 [x] 自定义,然后选择编辑,为相应的用户帐户添加权限,以激活和访问所需的 DCOM 应用程序或类。

这只是一个猜测,但请尝试一下,或者类似的方法(即通过 DCOMCNFG 授予对 CLSID 的访问权限)。

【讨论】:

【参考方案4】:

我很难使用公认的答案来解决这个问题,因为 Microsoft Word 97 - 2003 Document 记录未列在 DCOM 配置项中。我在this Technet blog post 中找到了解决方案,他们正确地解释了这个问题:

请务必注意,如果您安装 32 位 Microsoft Office 一台 64 位机器,您可能需要使用 32 位 DCOM 配置管理器 查看程序,具体取决于您的操作系统。

在从 Windows XP 到 Windows Server 2008 的 x64 操作系统上, 64 位版本的 DCOMCNFG.EXE 未正确配置 32 位 用于远程激活的 DCOM 应用程序。这种行为导致 旨在远程激活的组件,而不是 本地激活。在 Windows 7 和 Windows Server 2008 R2 及更高版本。

参考: http://msdn.microsoft.com/en-us/library/windows/desktop/ms678426(v=vs.85).aspx

并且还建议使用以下命令行命令(而不是DCOMCNFG)作为有效修复:

mmc comexp.msc /32

这会强制加载 32 位 DCOM 配置管理器而不是 64 位配置管理器,并允许执行已接受答案中描述的步骤。如果这仍然不起作用,本文还解释了许多其他可能的解决方法。

有关此主题的更多信息,您也可以在我的博客上read this post。

【讨论】:

【参考方案5】:

如果在 DCOM 中找不到 Microsoft Word 应用程序

在带有 32 位 Office 的 64 位系统上试试这个:

    列表项 开始 运行 mmc-32 文件 添加删除管理单元 组件服务 添加 好的 控制台根 组件服务 计算机 我的电脑 DCOM 配置

之后

    查找“Microsoft Word 97 - 2003 文档”(如果缺少,请检查是否 您的 Word 也是 64 位(如果您的 Windows 是)) 右键->属性 转到选项卡安全并编辑“自定义”单选按钮,以便 IIS_IUSRS 可能拥有启动和访问权限 转到选项卡标识并选择“交互式用户”应用更改 再试一次 如果这一切都失败了,还转到选项卡“常规”和“身份验证 级别”下拉菜单中选择“无”。

【讨论】:

【参考方案6】:

除了上述之外,我还遇到了一个问题,我想我会分享一下,以防其他人也遇到它。

我的 .net 应用程序使用互操作的应用程序池用户已添加到管理员,但由于 iis 缓存环境而未生效。执行上述操作后,除了 iisreset 以反映应用程序池用户的正确管理状态外,一切正常。

【讨论】:

以上是关于通过 asp.net 访问 Office Word 对象模型导致“由于以下错误而失败:80070005 访问被拒绝”。的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net读取Word

ASP.NET 网站,将word文档转换成PDF格式,然后上传的系统所在的文件夹。

在 ASP.net MVC6 网站上使用 Office 互操作

ASP.Net 添加 Interop for Word, excel 插件

在 Asp.Net 中使用 Office365 SMTP 时出错

ASP.NET实现导出word,在IE6中可以下载保存但在IE8中却不能??