asp.net - 使用 ASP.NET 实现 Word 自动化

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

我有一个在 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/

相关文章:

asp.net - 是否可以从 WebMethod 返回 html 表?

excel - 强制 COM 服务器保持打开状态

delphi - OLE 自动化 - WORD 表格 (Delphi)

outlook - 新 Outlook 预览应用程序的 ComObject 替代方案

Windows Server 2012 R2 智能卡限制

c# - ajax超时问题

c# - 访问转发器控件中的文本框

javascript - 如果下拉列表中的文本框文本如何防止回发?

asp.net - IIS 经典模式 .NET Web API 调用返回 404 错误

c# - 在 Windows Server 2012 中部署 ASP.NET MVC 5 应用程序