System.UnauthorizedAccessException: 使用 Word Interop 检索 COM 类工厂失败,出现错误代码 80070005。

34

我在使用Visual Studio 2008中的C# ASP .NET项目时遇到了问题。这个问题是在我重新安装Windows 7 Ultimate (x64)操作系统后出现的,同时我也安装了Office 2007。

我收到的错误信息如下:

System.UnauthorizedAccessException:检索具有CLSID {000209FF-0000-0000-C000-000000000046}的组件的COM类工厂失败,错误代码为80070005。 在xxx.Utility.WordDocument..ctor(String filePath, HttpServerUtility util) 中发生 在c:\xxx\Website\customer\communication.aspx.cs的customer_communication.BuCreate_click(Object sender, EventArgs e):line 127


也许你应该向我们展示 'c:\xxx\Website\customer\communication.aspx.cs' 文件的内容,这样我们才能了解你想要做什么。 - Joren
2
COM Guid在Google上返回了许多与Microsoft Office有关的引用,特别是2003版本。我认为这很可能是由于没有安装2003互操作组件所致? - Gregory
2
史诗般的标题!我喜欢它:D - Alastair Pitts
http://blog.crowe.co.nz/archive/2006/03/02/589.aspx - Thomas
11个回答

36

以下是解决此问题的方法:

我使用的是Win 7 64位和Office 2007。

运行程序“dcomcnfg -32”。(如果在64位下运行,您将找不到Word和Excel组件)

进入“控制台根目录/组件服务/计算机/我的计算机/DCOM配置/”

查找Microsoft Word和Excel并选择属性。

进入安全性,选择“配置权限”下的“自定义”。(如果需要,您可能还想更改其他权限,但我不需要)

添加“ IIS_IUSRS”并授予它“完全控制”。

现在进入“身份”并选择“交互式用户”。

完成后,别忘了按“确定”按钮。 :D

希望这能帮助您解决问题,也能帮助其他人解决同样的问题。


1
感谢您的帖子,它帮助我解决了我的问题。对于“Microsoft Excel预览器”对象,您必须执行相同的步骤。 - thiag0
1
正确的写法是 dcomcnfg /32。更多信息请参见此答案 - sra
8
我使用的是Win7 64位操作系统,安装了Office 2010(32位版本),但在“组件服务”中没有找到有关MS Word的任何信息。我该怎么办? - Jacek
“Starter”版本不适用于办公自动化。这可能是它们未列出的原因之一。 - nawfal
这对我有用,当我将我的控制台应用程序注册为任务计划程序中的任务时,但是在第二天凌晨12:00,这个错误再次发生了。您有什么想法为什么会这样吗? - Josh Monreal
@Jacek,我也遇到了这个问题,但是我不知道如何解决。后来我通过MMC添加了组件服务快照,可以参考Michael的答案:https://dev59.com/RXI_5IYBdhLWcg3wMf5_#8566553 - Jordan Ryder

9
您需要为ASP.NET进程标识(IIS 5上的{MACHINE}\ASPNET或IIS 6上的Network Service)授予对Word COM组件的访问权限:
“控制面板 - 管理工具 - 组件服务 - 计算机 - 我的计算机 - DCOM配置”
找到“Microsoft Word文档”,右键单击 - 设置 - 安全选项卡,为ASP.NET进程标识(IIS 5上的“ASPNET”,IIS 6上的“Network Service”)授予访问权限(本地和远程)。
如果您在打开/添加文档时遇到“System.Runtime.InteropServices.COMException (0x800A13E9): There is insufficient memory. Save the document now.”异常(我的个人经验),请从%Temp%和\Content.Word文件夹中删除临时文件。

11
我遇到了同样的问题,但在DCOM配置中找不到“Microsoft Word文档”。 - Larry Watanabe
1
“Microsoft Word Document” 已本地化为您的 MS Office 语言。例如,在俄语中,其名称为 “Документ Microsoft Word”。此外,您可以通过在右侧列(使用表格视图)中使用 CLSID {000209FF-0000-0000-C000-000000000046} 来查找它。 - Serge S.
“本地和远程”选项位于“安全”选项卡中的“启动和激活权限”组内。 - Ian Newson
3
我无法在DCOM配置中找到CLSID或Microsoft Word文档。 - gbbosmiya
如果您已安装了MS Word,则应该存在CLSID。请记住,“Microsoft Word文档”将本地化为您的系统语言。不幸的是,DCOM Config不允许按CLSID排序,因此按CLSID值查找是非常烦人的事情。 - Serge S.

8
启动 dcomcnfg -32dcomcnfg /32 都无法在列表中显示目标应用程序(Microsoft Excel)。但是,按照@如何使IIS7与Office Interop协作的指示,特别是关于启动 mmc -32 并手动添加组件服务管理器的注意事项,我成功地让它出现了。(注意:尽管链接谈到了IIS7,但我的问题是与Windows服务有关)。
以下是具体步骤:
1.开始 > 运行 > dcomcnfg(如果在第3步找不到应用程序,则可以使用“mmc -32”然后手动添加组件服务管理器) 2.导航到组件服务 > 计算机 > 我的计算机 > DCOM配置 3.找到给您带来麻烦的MS应用程序(例如:Excel的“Microsoft Excel Application”或Word的“Microsoft Word 97-2003文档”) 4.右键单击 > 属性 5.在安全选项卡上:选择启动和激活权限下的自定义,然后单击编辑... 6.添加站点正在运行的帐户(例如:网络服务)并分配本地启动和本地激活权限 7.完成!

6
这对我有用:
  1. 在命令行中输入DCOMCNFG
  2. 组件服务->计算机->我的计算机->DCOM配置
  3. 找到“Microsoft Word 97 - 2003 Document”(如果缺失,请检查您的Word是否也是64位)
  4. 右键单击->属性
  5. 转到“安全性”选项卡并编辑“自定义”单选按钮,以使IIS_IUSRS可以拥有启动和访问权限
  6. 转到“身份验证”选项卡并选择“交互式用户”
  7. 应用更改并重试
  8. 如果所有这些都失败了,还可以转到"常规"选项卡,在"认证级别"下拉列表中选择"无".

5
这个对我来说有些棘手,也许我的Windows技能还不够好。但是我不能在Windows Server 2008上以32位模式运行组件服务。希望这能帮助其他遇到相同问题的人:
  1. 通过任一先前提到的方法(运行框或管理工具)运行"组件服务";关闭该程序
  2. 将"C:\Windows\System32\mmc.exe"/32粘贴到运行框中并按Enter键(在任务管理器中验证是否看到mmc.exe *32)
  3. 转到文件,您应该在列表中看到comexp.msc(因为步骤1),选择它,它将在32位模式MMC控制台中打开组件服务。

编辑:为了使Word Interop在Windows Server 2008上正常工作,我还必须按照此答案中所述创建桌面文件夹。


1
你可以在运行框中简单地使用命令 MMC comexp.msc /32 - MrK

2

修复Tomas的答案,Windows Server 2k8 x64上正确的命令是:“dcomcnfg /32”(斜杠而不是破折号)

此外,我还必须通过添加具有完全权限的IIS_IUSRS来自定义所有安全选项,以便于启动和激活权限、访问权限和配置权限。在Identity选项卡中,也需要添加Interactive user。然后它就可以正常工作了。

我在使用Word 2010打开doc文件时遇到了这个问题,我不得不将其设置为Microsoft Word 97-2003 Document属性。


我也认为你需要以管理员身份运行dcomcnfg才能使其正常工作! - mortb

1

这个错误对应于.NET System.UnauthorizedAccessException,通常是由于您的代码尝试创建的COM组件访问设置错误引起的。

您可以尝试启动dcomcnfg实用程序,转到DCOM设置,选择所需的对象并允许该帐户下运行的ASP.NET代码访问它。这应该解决您的问题。


这是正确的,但如果你正在运行Windows 7 64位系统,你必须以32位启动dcomcnfg:“dcomcnfg -32”。如果你不这样做,你将找不到Word或Excel来设置权限。 - Tomas I

0

前往注册表 HKCR>TypeLib>{00020905-0000-0000-C000-000000000046}>8.7>0,然后删除文件夹 "win32",这是为了解决 Word COM 类错误。

前往注册表 HKCR>TypeLib>{00020813-0000-0000-C000-000000000046}>1.9>0,然后删除文件夹 "win32",这是为了解决 Excel COM 类错误。

尝试该方法,该方法已经解决了我的问题。


0

我创建了文件夹C:\Windows\System32\config\systemprofile\desktop,解决了我的服务无法打开Excel文件的问题。


0

我曾经遇到过同样的问题,最终发现是因为我的用户没有运行“远程过程调用(RPC)”服务的权限。 在控制面板的管理工具中,我查找了该服务,并在登录时选择了“本地系统帐户”,然后重新启动了系统,问题得到解决。


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