2

我有一个在 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 用户“本地启动”、“本地激活”和“本地访问”。这使得应用程序需要一些时间来响应(超过一分钟)并失败并出现以下错误:

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

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

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

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

  • C:\Windows\SysWOW64\config\systemprofile
  • C:\Windows\Temp
  • HKU.DEFAULT\Software\Microsoft\Office
  • HKLM\Software\Wow6432Node\Microsoft\Office
  • HKLM\Software\Wow6432Node\Microsoft\Shared Tools

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

我还尝试在 DCOM 身份中设置特定用户(本地管理员),但没有任何变化。

现在我恢复了所有权限,我又回到了 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 添加到管理员组,它仍然会失败。

关于下一步的任何想法?

4

2 回答 2

1

所以这就是最后的工作:

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

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

于 2014-08-14T17:54:37.813 回答
1

我在 Windows Server 2016 和 Office 2013 上使用 Office 互操作的旧代码遇到了完全相同的错误,这让我发疯了。所以首先我想加入那些已经提到过最好的做法是不使用它并将你的代码重写为 DocX 或类似的人,如果你有任何机会的话。它只是有太多的陷阱会消耗时间。

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

于 2021-04-16T17:33:24.897 回答