我有一个在 asp.net 中使用 Microsoft Word 自动化的旧应用程序,我需要将其安装在带有 Office 2013 Standard x86 的 Windows Server 2012 R2 x64 上。我知道应该避免使用像 IIS 这样的服务器技术中的办公自动化,但目前我还没有机会重写应用程序,所以我必须按原样使用它。
最初我启动了该应用程序,但出现了以下错误:
Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
网上查到一些资料,{000209FF-0000-0000-C000-000000000046}是通用Word的标识符,没有具体版本。
我转到“组件服务”->“我的电脑”->“DCOM 配置”->“Microsoft Word 97 - 2003 文档”(请注意,没有用于 Microsoft Word 或 MS Word 或 Word 的节点,而有用于 Microsoft Excel 的节点)并更改了安全性允许 IIS AppPool 用户“本地启动”、“本地激活”和“本地访问”。这使得应用程序需要一些时间来响应(超过一分钟)并失败并出现以下错误:
Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
同时事件查看器系统日志显示:
The server {000209FF-0000-0000-C000-000000000046} did not register with DCOM within the required timeout.
我在网上搜索了一下,发现一些信息可能是访问权限不对,包括系统驱动器路径和注册表。我运行进程监视器并检查进程试图打开的内容。我授予 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
当我再次运行该应用程序时,它仅在进程监视器中显示一些访问问题,这似乎只是尝试读取不同的配置。应用程序本身不再显示任何类型的错误,它只是卡住了。我没有在该计算机上安装 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 添加到管理员组,仍然失败。
对下一步有什么想法吗?
最佳答案
这就是最后的效果:
- 创建管理员用户并在 DCOM 设置中将 Word 设置为使用该用户运行
- 在设置中向 AppPool 用户以及 IIS_IURS 和 IUSR 授予激活、启动和访问权限。请注意,如果您不向其他人授予权限,仅向 AppPool 用户授予权限,Windows 仍会报告 AppPool 用户没有足够的权限,这完全是一种误导
我还找出了卡住 Word 的问题所在:创建新文件导致 Word 以特殊模式打开,在该模式下它会告诉您该文件可能存在危险。当然,使用 COM 您不会看到问题,但除非您允许,否则它将无法继续。这是 Word 2013 中的新行为,这就是我之前没有的原因。
关于asp.net - 使用 ASP.NET 实现 Word 自动化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289335/