通过 asp.net 访问 Office Word 对象模型会导致“由于以下错误失败:80070005 拒绝访问”。

52

我开发了一个网站,允许用户上传Office文档,然后使用office对象模型将文档转换为HTML文件,并在iFrame中显示。

当然,我已经包含了对Office.interop.word的引用,在我的开发机器上该站点运行良好。但是当我将其上传到生产服务器时,该站点功能正常,直到我尝试上传文档。一开始我收到了类似“COM对象未注册”的错误,后来我意识到生产服务器上没有安装Word。因此我安装了Word,但现在当服务器尝试访问Word对象模型时,我收到以下错误:

检索组件的CLSID {000209FF-0000-0000-C000-000000000046} 的COM类工厂失败,原因是以下错误: 80070005 访问被拒绝。(异常来自HRESULT: 0x80070005 (E_ACCESSDENIED))

我在注册表中搜索了相应的CLSID并找到了相应的文件夹。我为IUSR_帐户添加了完全控制权限,并由于错误的持久性,最终向“所有人”添加了完全控制权限,并确保这些权限继承到文件夹的其余部分。然后我向IUSR_添加了完全控制权限,并最终向“所有人”添加了完全控制权限,以及我将完全控制权限添加到了我的Microsoft Office文件夹。

我不知道该授予哪些其他权限以及在哪里授予这些权限,才能消除“访问被拒绝”的错误。我必须在错误的地方进行授权,因为据我所知,我不能比“所有人”“完全控制”更具包容性。

有人能提供任何帮助吗?


Word 的这种使用方式不被微软支持。而且,可扩展性极差。有其他供应商提供的替代方案可以支持这种情况... - Per-Frode Pedersen
这是导致异常的特定代码行: Dim wordApplication As New Microsoft.Office.Interop.Word.Application()您能详细说明一下“Microsoft不支持使用Word”吗?这似乎是一个笼统的说法。您是否意味着不能通过asp.net访问Word对象模型?即使如此,我仍然想弄清楚为什么会出现此异常。即使不受支持,只要我能够解决这个错误,对象模型就可以满足我的需求。您能指引我一些您提到的替代方案吗? - Camenwolf
3
不要在ASP.NET应用程序中使用Office Interop。请参阅考虑Office服务器端自动化的注意事项 - John Saunders
6个回答

64

好的,我通过以下步骤解决了这个问题:

  1. 在命令行中输入DCOMCNFG
  2. 展开控制台根节点 > 组件服务 > 计算机,在我的电脑上右键单击并选择属性
  3. 在 COM 安全选项卡 > 启动和激活权限中单击编辑默认值
  4. 添加用户(例如IIS_IUSRS)或服务
  5. 勾选允许本地启动和本地激活

然后 Excel、Word 和其他应用程序就可以正常工作了,祝你好运。


我已经按照这个做了。上述错误已经被解决了。 var objWord = new Microsoft.Office.Interop.Word.Application(); objWord.Documents.Open(FileName: htmlTemplateFile + @"" + strFilename); objWord.Visible = false; if (objWord.Documents.Count > 0) {} }但是现在即使文档存在,我也无法获得objWord.Documents.Count>0。 在Visual Studio开发服务器中,同样的事情运行良好。 - Kamran Shahid
哇!这已经在一年内帮我解决了两次问题。谢谢 :) - Ali Baig
这不是安全上的“大忌”吗?这样是否允许执行任何DCOM组件到IIS?我真的很感兴趣,因为这一直是我克服类似问题的唯一方法 - 只允许在特定的DCOM组件上启动不起作用,我必须对我的计算机进行操作。 - GilesDMiddleton
安全性 -- 如果可能的话,我建议缩小特定包/应用程序的激活权限(请参见gyosifov的答案https://dev59.com/e3A75IYBdhLWcg3wGU-I#26295661),并且只在最后一步才恢复到“赋予所有权限”的状态。 - CJBS

52

以下方法对我有效:

  1. 在命令行中输入 DCOMCNFG
  2. 组件服务 -> 计算机 -> 我的电脑 -> DCOM 配置
  3. 找到"Microsoft Word 97 - 2003 文档" (如果缺失,请检查您的 Word 是否也是 64 位(如果您的 Windows 是),如果不是,请按照Darkseal这里建议的,在步骤 1 中运行 mmc comexp.msc /32 而不是 DCOMCNFG)
  4. 右键单击 -> 属性
  5. 转到安全选项卡并编辑 "自定义" 单选按钮,以便 IIS_IUSRS 可以拥有启动和访问权限
  6. 转到标识选项卡,并选择 "交互用户"
  7. 应用更改后再次尝试
  8. 如果所有这些都失败了,请转到 "常规" 选项卡,在 "身份验证级别" 下拉列表中选择 "无"。

1
如果您的安装是64位,您该怎么办? - mdw7326
3
对于在64位机器上运行的32位COM包,可以使用mmc comexp.msc /32命令来运行DCOMCNFG,参考Darkseal的回答(https://dev59.com/e3A75IYBdhLWcg3wGU-I#43736859)。@gyosifov - 请考虑在步骤#1中包含此信息。 - CJBS
1
@Villat,说实话我也不太确定,我是偶然发现的。这与两个应用程序(Word和IIS进程)之间的数据包安全有关。我怀疑Windows服务器版本通过抽象和分离进程来处理事物的策略不同。我找不到太多信息,但这里有两个链接:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd145596%28v%3dws.11%29 https://learn.microsoft.com/en-us/windows/desktop/com/authentication-level - gyosifov
2
这可能是SO中最好的答案。你刚刚救了我的命。 - Koby Douek
1
@gman 对于 .net web 应用程序,只需要 IIS_IUSRS 就足够了。如果你有一个桌面应用程序 - 那么运行应用程序的用户 - gyosifov
显示剩余8条评论

13
请查看Word所在的服务器机器上的事件查看器,在Windows日志->系统下。您是否看到类似以下内容的日志记录:
“机器默认权限设置未授予本地激活权限,以便向用户SomeMachine\SomeUser SID(S-1-5-21-483881670-2168941642-1987552629-1003)从地址LocalHost(使用LRPC)提供具有CLSID {148BEE7F-6123-41EE-8CCA-E390902BD0D8} 的COM服务器应用程序。可以使用组件服务管理工具修改此安全权限。”
如果是这样,请运行DCOMCNFG.EXE,并转到组件服务->计算机->我的电脑(或其他名称)-> DCOM配置(如果询问是否要修复任何内容,则只需回答“No”即可)。 如果事件日志消息是针对“应用程序”的话,就按照事件日志消息中的名称找到它,如果事件日志消息是针对CLSID(像上面的示例)的,则通过CLSID“{148B…}”(我刚刚粘贴的是随机的CLSID - 可能会与您上面的000209FF…匹配)进行查找,并选择 更多操作...属性,转到安全选项卡。
在此处,您可以选择[x] 自定义,然后进行编辑,以添加适当用户帐户的权限来激活和访问所需的DCOM应用程序或类。这只是一个猜测,但请尝试这样做,或类似这样的操作(即通过DCOMCNFG授予对CLSID的访问权限)。

6
我曾经遇到过困难,尝试使用已接受的答案解决问题,但是在DCOM配置项中没有列出“Microsoft Word 97 - 2003文档”记录。我在这篇Technet博客文章中找到了解决方案,他们正确地解释了问题:

需要注意的是,如果在64位机器上安装32位Microsoft Office,则可能需要使用32位DCOM配置管理器查看程序,具体取决于操作系统。

在Windows XP到Windows Server 2008的x64操作系统上,DCOMCNFG.EXE的64位版本无法正确配置32位DCOM应用程序进行远程激活。此行为会导致应该被远程激活的组件被本地激活。这种情况不会发生在Windows 7和Windows Server 2008 R2及更高版本中。

参考: http://msdn.microsoft.com/en-us/library/windows/desktop/ms678426(v=vs.85).aspx

此外,他们还建议使用以下命令行命令(而不是DCOMCNFG)作为有效的修复方法:
mmc comexp.msc /32

这会强制加载32位DCOM配置管理器,而不是64位的,从而可以执行接受答案中描述的步骤。如果仍无法解决问题,该文章还介绍了一些其他可能的解决方法。
有关此主题的更多信息,您也可以在我的博客上阅读这篇文章

2
如果在DCOM中找不到Microsoft Word应用程序
在64位系统上,安装了32位Office,请尝试以下步骤:
1.单击“开始”按钮。
2.输入“mmc-32”,然后按Enter键。
3.选择“文件”。
4.选择“添加/删除控件”。
5.选择“组件服务”。
6.单击“添加”。
7.单击“确定”。
8.展开“控制台根”。
9.展开“组件服务”。
10.展开“计算机”。
11.展开“我的计算机”。
12.展开“DCOM配置”。
接下来:
1.查找“Microsoft Word 97 - 2003文档”(如果缺少,请检查您的Word是否也是64位(如果您的Windows是))。
2.右键单击,选择“属性”。
3.转到“安全性”选项卡,并编辑“自定义”单选按钮,以便IIS_IUSRS可以具有启动和访问权限。
4.转到“标识”选项卡,并选择“交互式用户”。应用更改并重试。
5.如果所有这些都失败了,请还要转到“常规”选项卡,并在“身份验证级别”下拉列表中选择“无”。

1
除了上述内容,我遇到了一个问题,我想分享一下,以防其他人也遇到同样的问题。
我的.NET应用程序使用互操作性,应用程序池用户被添加到管理员组,但由于IIS缓存环境而未生效。在执行上述操作后,再进行IIS重置以反映应用程序池用户的正确管理员状态,一切都正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接