使用ASP.NET进行Word自动化

时间:2014-08-13 14:49:02

标签: asp.net office-automation windows-server-2012-r2

我有一个在asp.net中使用Microsoft Word自动化的旧应用程序,我需要在带有Office 2013 Standard x86的Windows Server 2012 R2 x64上安装它。我知道应该避免使用像IIS这样的服务器技术中的Office自动化,但我现在还没有重写应用程序,所以我必须按原样使用它。

最初我启动了应用程序并且它给出了这个错误:

  

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

我在网上发现一些信息{000209FF-0000-0000-C000-000000000046}是通用Word的标识符,没有特定的版本。

我去了组件服务 - >我的电脑 - > DCOM配置 - > Microsoft Word 97 - 2003文档(请注意,Microsoft Word或MS Word或Word没有节点,而有一个用于Microsoft Excel)并更改了安全性以允许IIS AppPool用户"本地启动",& #34;本地激活"和"本地访问"。这使得应用程序需要一些时间来响应(超过一分钟)并因以下错误而失败:

  

检索具有CLSID {000209FF-0000-0000-C000-000000000046}的组件的COM类工厂由于以下错误而失败:80080005服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE))。

同时事件查看器系统日志显示:

  

服务器{000209FF-0000-0000-C000-000000000046}未在规定的超时时间内向DCOM注册。

我在网上搜索并发现了一些访问权限可能不正常的信息,包括系统驱动器路径和注册表。我运行了Process Monitor并检查了进程尝试打开的内容。我给IIS AppPool用户完全访问以下内容:

  • C:\的Windows \ Syswow64资料\配置\ systemprofile
  • C:\的Windows \温度
  • HKU.DEFAULT \软件\微软\办公室
  • HKLM \ SOFTWARE \ Wow6432Node \微软\办公室
  • HKLM \ Software \ Wow6432Node \ Microsoft \ Shared Tools

当我再次运行应用程序时,它只显示Process Monitor中的一些访问问题,这似乎只是尝试读取不同的配置。应用程序本身不再显示任何类型的错误,它只是冻结了。我没有在该计算机上安装Visual Studio,但我没有在应用程序日志中看到任何错误,因此没有抛出任何异常。

我还尝试在DCOM Identity中设置特定用户(本地管理员),但没有任何更改。

现在我恢复了所有权限,我又回到了0x80080005错误,因为它至少给了我一些尝试的信息。

我成功地使用以下代码在一个简单的应用程序中重现错误:

try
{
    l1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
    var application = new Microsoft.Office.Interop.Word.Application();
    l2.Text = "OK";
}
catch (Exception ex)
{
    this.Label2.Text = ex.ToString().Replace("\r\n", "<br/>");
}

在带有Office 2013 Pro x64的Windows 8 x64上也出现故障,但错误完全相同。

如果我冒充当前用户为管理员,那么它可以正常工作。但是,即使将IIS APPPOOL \ DefaultAppPool添加到管理员组,它仍然会失败。

关于后续步骤的任何想法?

2 个答案:

答案 0 :(得分:1)

我在 Windows Server 2016 和 Office 2013 上使用 Office Interop 时遇到与旧代码完全相同的错误,这让我很生气。因此,首先我想加入那些已经提到最佳实践的人,如果有机会,最好不要使用它并将您的代码重写为 DocX 或类似的代码。只是有太多的陷阱会消耗时间。

我遵循了 Vladimirs 帖子的所有提示,但仍然出现错误。毕竟是项目 Office 的 doc 文件模板无法在互操作模式下打开(但在服务器上的 RD 会话中打开没有任何问题)。它们是在较旧的 Office 版本中创建的。我在 Word 中打开/保存过一次模板,一切正常。

答案 1 :(得分:0)

这就是最后的结果:

  • 创建管理员用户并将Word设置为在DCOM设置中使用它运行
  • 在设置中,为AppPool用户以及IIS_IURS和IUSR提供激活,启动和访问权限。
  • 请注意,如果您不向其他用户授予其他用户权限,则Windows仍会报告AppPool用户没有足够的权限。

我还想知道冻结Word的问题是:创建新文件导致Word在特殊模式下打开,它会告诉您文件可能有危险。当然使用COM你不会看到问题但是在你允许它之前它将无法继续。这是Word 2013中的一种新行为,这就是我之前没有这样做的原因。