使用CLSID检索组件的COM类工厂{00020906-0000-0000-C000-000000000046}

时间:2017-06-12 18:17:41

标签: c# asp.net iis office-interop

所以,我已经做了很多挖掘我已经得到的错误,我想我已经尝试了我在这个网站以及微软论坛上看到的每一个解决方案。我希望有人能告诉我我做错了什么并帮助我。

Application wordApp = new Application();
Document wordDoc = new Document();

当我的应用程序进入上面的第二行代码时,它出错了:

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

我见过的所有解决方案都是编辑DCOM设置以允许应用程序池/经过身份验证的用户/ IUSR /网络服务/我可能忘记了一个或两个其他适用于我的IIS实例。 (我们在7.5)

我们所有的Intranet应用程序都通过Internet选项>使用自动登录和当前用户名和密码选项。安全设置>本地Intranet区域以及我们的所有应用程序在整个会话期间模拟客户端。

根据我发现的建议,我已将DCOM设置设置为全局级别,以及我知道用户所在的Active Directory组的本地Microsoft Word应用程序级别,并继续获取同样的错误。

试图查看我是否可以使用应用程序池标识,而不是尝试了这个:

private static WindowsImpersonationContext context = null;
context = WindowsIdentity.Impersonate(System.IntPtr.Zero);

并为IIS AppPool \ MyAppPoolName提供了DCOM设置权限,错误仍然存​​在。

我现在找不到链接,但我尝试的另一个解决方案是将桌面文件夹添加到以下位置,因为存在某种错误,并为我的用户和/或应用程序池ID提供访问权限。这也行不通。

C:\的Windows \ system32 \设置\ systemprofile \

C:\的Windows \ Syswow64资料\配置\ systemprofile \

如果有人有任何建议,我很乐意听到。我完全没有想法了。如果我没有提供足够的信息,我会很乐意提供更多信息。感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

您无法使用以下代码在Word中实例化新文档:

 Document wordDoc = new Document();

相反,您需要使用Add方法将新文档添加到Documents集合中:

 wordApp.Documents.Add(); 

您可能会发现How to: Programmatically Create New DocumentsHow to automate Microsoft Word to create a new document by using Visual C#条款有用。

请注意,Microsoft目前不推荐也不支持任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)的Microsoft Office应用程序自动化,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。请在Considerations for server-side Automation of Office文章中详细了解相关内容。

作为一种解决方法,如果您只处理打开的XML文档,则可以考虑使用Open XML SDK。或者考虑使用为服务器端执行而设计的任何第三方组件。