我有一个在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用户完全访问以下内容:
当我再次运行应用程序时,它只显示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添加到管理员组,它仍然会失败。
关于后续步骤的任何想法?
答案 0 :(得分:1)
我在 Windows Server 2016 和 Office 2013 上使用 Office Interop 时遇到与旧代码完全相同的错误,这让我很生气。因此,首先我想加入那些已经提到最佳实践的人,如果有机会,最好不要使用它并将您的代码重写为 DocX 或类似的代码。只是有太多的陷阱会消耗时间。
我遵循了 Vladimirs 帖子的所有提示,但仍然出现错误。毕竟是项目 Office 的 doc 文件模板无法在互操作模式下打开(但在服务器上的 RD 会话中打开没有任何问题)。它们是在较旧的 Office 版本中创建的。我在 Word 中打开/保存过一次模板,一切正常。
答案 1 :(得分:0)
这就是最后的结果:
我还想知道冻结Word的问题是:创建新文件导致Word在特殊模式下打开,它会告诉您文件可能有危险。当然使用COM你不会看到问题但是在你允许它之前它将无法继续。这是Word 2013中的一种新行为,这就是我之前没有这样做的原因。