我有一个在 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 添加到管理员组,它仍然会失败。
关于下一步的任何想法?