Word 自动化:无法打开宏存储

Jos*_*s57 4 vb.net ms-word office-interop

我的应用程序(通过 ClickOnce 部署的 vb.net windows 应用程序)使用 Word 打开和填充 .dot 模板以创建新的 Word 文档。我参考了 Microsoft Word 14 Object Library 并使用了以下代码:

Dim oWord As Word.Application = Nothing
Dim oDoc As Word.Document = Nothing
Try
    oWord = New Word.Application
    Dim strFileName As String = ""
    Select Case strType
        Case "LettreReception"
            strFileName = Path.Combine(GetParam(1), "Template_LettreReception.dot")
            If File.Exists(strFileName) Then
                oDoc = oWord.Documents.Add(strFileName)
Run Code Online (Sandbox Code Playgroud)

在最后一行,我在部署的机器上(不是在我的开发机器上)收到“无法打开宏存储”错误。

我使用 Windows 7 - Office 2010 - VS 2010 (.Net 3.5) 进行开发。我的部署机器也是安装了 Office 2010 的 Windows 7。

我试图删除 normal.dotm(我发现了一些建议它的链接)但没有成功。使用的 .dot 模板不包含宏。

小智 5

检查 word 文档的属性并确保文件未阻止。有时,当您从另一台计算机获取文档或从 ​​Internet 下载文档时,它们会被阻止,这将导致抛出此异常“无法打开宏存储”


小智 3

由于 Word Interop 实际上在后台运行,就像在交互式会话中运行一样,因此执行期间使用的帐户需要某些权限。

您是否在 Web 应用程序中使用 Windows 身份验证和模拟?如果是这样,被模拟的用户必须具有服务器的本地登录权限才能运行 Word...此外,您必须使用该帐户实际登录到服务器至少一次,以便该用户的配置文件存在于该计算机上这样就可以加载注册表配置单元了。我还发现您可能需要以该用户身份至少实际运行一次 Word(以确保在尝试从代码运行 Word 之前处理所有首次初始化消息)。

如果没有,那么应用程序运行的服务帐户(通常是网络服务)需要上述权限(我将很快描述),并且您必须执行一些奇特的操作,例如在运行时动态加载注册表配置单元。就我个人而言,我更喜欢使用在相关服务器上具有本地登录权限的用户帐户来实现代码内临时模拟。

本地登录权限可能有点棘手,具体取决于您的网络和组策略配置(如果您想要一定程度的安全而不仅仅是使用域管理员帐户)。

在 VS 中运行的计算机上一切正常的原因是,Web 应用程序的上下文是您的用户帐户 - 当然,它在您的计算机上具有本地登录权限,并且具有可加载的注册表配置单元。

现在的权限:

  • 首先,您必须在服务器上运行“dcomcnfg”并进行以下配置更改:

    • 右键单击“组件服务\计算机\我的电脑\DCOM Config\Microsoft Word 97 - 2003 文档”,然后转到“属性”
    • 在“属性”屏幕中,转到“安全”选项卡并将“启动和激活权限”更改为“自定义”。
    • 单击“编辑”按钮,将本地计算机 NETWORK SERVICE 帐户(如果不使用模拟...如果使用模拟,添加适当的用户或组)添加到用户列表中,然后选中“本地启动”和“本地激活”
  • 确保本地计算机 NETWORK SERVICE 帐户(如果不使用模拟...如果使用模拟,则相应的用户或组)对要打开的文件夹和文件具有适当的读取/修改权限和/或保存到。

  • 在以下位置创建一个“桌面”目录:C:\Windows\System32\config\systemprofile\ 并向本地 NETWORK SERVICE 帐户(或您的 ASP .NET 应用程序运行所在的帐户)授予完全权限 [注意:我相信这一点并且仅当不使用模拟时才适用下一步]

  • 授予对 C:\Windows\System32\config\systemprofile 文件夹的修改/读取/执行权限

希望对一些人有所帮助并且不会太令人困惑......