【问题标题】:DCOM Failure of Office Automation办公自动化的DCOM故障
【发布时间】:2010-12-13 21:59:18
【问题描述】:

我开发了一个 C# 程序,它从 SQL Server 数据库中提取数据,然后生成包含数据的 Word 文档。我已将该程序设置为在 Windows Server 2003 机器上作为 SSIS 作业的一部分运行。该程序作为没有管理权限的用户 SQLSVC 运行。当我以 SQLSVC 身份登录并运行程序时,它会正确执行。但是,当程序作为 SSIS 作业自动运行时,它会冻结在以下代码行

Microsoft.Office.Interop.Word.Application word =
    new Microsoft.Office.Interop.Word.Application();

当我强行终止进程时,会生成以下错误消息。

Error Message: System.Runtime.InteropServices.COMException (0x80080005):
Retrieving the COM class factory for component
with CLSID {000209FF-0000-0000-C000-000000000046}
failed due to the following error: 80080005.
   at IepGlance.Program.CreateNewIepFiles(Dictionary`2
       iepDictionary, EasyIepDataContext dbContext)
   at IepGlance.Program.Main(String[] args)

据我所知,问题在于 DCOM 权限。我已经使用 dcomcnfg 将所有可能的 DCOM 权限添加到用户 SQLSVC,但这没有帮助。还有其他可能的解决方案吗?

【问题讨论】:

标签: c# windows ms-office dcom


【解决方案1】:

运行程序“dcomcnfg -32”。 (64位下找不到word和excel组件) 转到“控制台根目录/组件服务/计算机/我的电脑/DCOM 配置/”查找 Microsoft Word 和 Excel 并选择属性。 转到安全并选择“配置权限”下的“自定义”。(如果需要,您可能还想更改其他权限,但我不需要)添加“IIS_IUSRS”并赋予它“完全控制”。 现在转到“身份”并选择“交互式用户”。

【讨论】:

  • 这让我到了正确的地方。使用 dcomcnfg -32 我仍然看不到它,但 mmc comexp.msc /32 成功了。
  • 对我来说,在使用与 Word 相关的 dcomcnfg -32dcomcnfg -64mmc comexp.msc /32mmc comexp.msc /64 时,“Microsoft”下根本没有任何内容。浪费了我的时间。 Office 2016,Windows 10 专业版。
  • 如果我刚刚打开mmcmmc -32,我能够在DCOM Config 下找到Microsoft Word 97-2003 Document
【解决方案2】:

这里有几件事。

首先,这个thread on SO 可能会有所帮助。

其次,Microsoft warns 当您通过无人值守的过程自动化 Office 时可能会出现“并发症”。这是妙语(原文加粗):

微软目前没有 推荐,不支持, 微软办公自动化 从任何无人看管的应用程序, 非交互式客户端应用程序或 组件(包括 ASP、ASP.NET、 DCOM 和 NT 服务),因为 Office 可能表现出不稳定的行为和/或 在此运行 Office 时出现死锁 环境。

链接的文章讨论了解决方法。

【讨论】:

    【解决方案3】:

    这取决于您使用的是 64 位计算机,以及您是 32 位 Office 还是 64 位 Office,但在任何一种情况下,您都需要进入 Admin Tools > Component Services 并在 DCOM config 下找到“Microsoft Word 97 - 2003 Document”,然后将“身份”设置为运行您的应用程序池的用户。或者干脆禁用它的安全性。

    如果您使用 32 位 Office 运行 64 位服务器,则可能无法找到此 DCOM 设置。您需要从命令提示符运行“MMC -32”以启动 32 位 MMC,然后从“文件 > 添加/删除管理单元”菜单中添加“组件服务”。

    希望对你有所帮助

    【讨论】:

    • 似乎即使是完全 32 位的环境也可能会被搞砸:在运行 VS2008 和 MSO 2003 时,具有西里尔语言环境的 Windows 8 对这种萨满教是无懈可击的。奇怪的是,'mmc' 和 '即使在 32 位系统上,mmc -32' 仍然提供对不同存储的访问。
    • 你如何“禁用它的安全性”?我用我正在使用的服务的身份尝试了它,该服务试图做类似于 OP 的事情,但它没有用。
    • 您需要识别与导致问题的类型匹配的正确 ClassID 或 GUID。一旦您知道 DCOM 安全性阻止了哪个类,您就可以打开管理控制台并调整该组件的安全性。要打开管理控制台,您需要运行命令“MMC”——如果您的 COM 组件在 64 位计算机上是 32 位,则需要另一个参数“-32”。打开控制台后,按类 ID 找到类并调整属性。
    【解决方案4】:

    从我身边一点, 我在我们的一台服务器上安排批处理作业,它在我的本地运行时抛出了同样的错误。

    我尝试了上述所有步骤,但在我的情况下,实际情况有所不同。

    无论何时安排批处理作业,都不要选择 [无论用户是否登录都运行] 选项,因为这需要管理员访问权限,如果没有,则有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多