【问题标题】:Programmatic access to the VBA project is not trusted (Option is ticked, Word 2013)对 VBA 项目的编程访问不受信任(勾选选项,Word 2013)
【发布时间】:2016-06-29 19:55:21
【问题描述】:

详情

  • 加载项类型:VSTO (VB.Net)
  • Word 版本:2013

症状

当我在插件的Startup 事件期间尝试将 VBA 模块注入用户的Normal.dotm 模板时,即使勾选了该选项,我也会收到VBA project is not trusted 错误。当我尝试从模板中获取 VBProject 对象时会发生这种情况:

Private Sub ThisAddIn_Startup() Handles Me.Startup
    Dim template as Word.Template = GetNormalTemplate()
    If template IsNot nothing Then
        Dim vbProj = template.VBProject 'Error thrown here
    End If
End Sub

只有在勾选General 选项Show the start screen when this application starts 时才会发生这种情况。

出于某种原因,即使在 splash 屏幕期间加载了普通模板,但在您实际显示文档之前,VBProject 在 start 屏幕上不可用(空白或其他)。

结果

我设法通过在WindowActivate 事件第一次触发而不是在加载项的Startup 事件期间运行代码来实现我的目标:

Property hasInjectedVba As Boolean = False
Private Sub WindowHasActivated() Handles Application.WindowActivate
    If Not hasInjectedVba Then
        Try
            injectVba()
            hasInjectedVba = True
        Catch ex As Exception
            'handle the something that went wrong
        End Try
    End If
End Sub

总结
如果您尝试安全地执行此操作,Cindy 提出了一些非常好的观点,最重要的是 The security measure not allowing programmatic access to VB projects can remain in-place 如果您使用插件模板 - 这完全避免了这个问题。

【问题讨论】:

  • 不太清楚,所以请仔细检查:问题源于更新,“信任访问”没有保持检查的事实?这是公司/网络环境?您是否与网络管理员核对过组策略或类似的东西是否强制执行不信任 VBA 项目?如果我是网络管理员,我当然不会允许这样做——这是一个重大的安全漏洞。您是否考虑过将 VBA 代码作为 VBA 模板分发,您的加载项可以加载为“模板加载项”?
  • 不,它一直在检查 - 我最初遇到了这个问题,我检查过没有 GP(组策略)更改它,没有。就在我离开工作之前,它似乎缩小到了在后台视图中打开单词的用户(我的设置为打开到与以前版本一样的空白文档)我正在注入normal.dotm 也是,所以可能是它当时没有加载,但我收到了受信任的错误消息。
  • 使用新信息将您的问题发送给edit 是个好主意。而且,是的,我怀疑没有加载 Normal.dotm 可能是一个问题。错误可能只是在无法访问时触发,无论原因如何。我坚持我的建议,即提供一个加载项模板,而不是通过 VBE 访问 Normal.dotm :-)
  • 嘿 Cindy,是的,我刚回来读了一遍,现在我回家了,老实说,它可能需要重写 - 我肯定会接受其他路线的建议,请耐心等待我会读当我在健身房后回到家并更新我的问题时 - 谢谢:)
  • 没问题 - 我很快就会离线过夜,所以至少 12 小时,也许 18 小时内看不到任何新内容。

标签: vb.net vba ms-word vsto


【解决方案1】:

与其将代码注入用户的 Normal.dotm,不如考虑创建一个模板 (*.dotm),以便与您的外接程序进行交互。

除了 COM 加载项(VSTO 利用的技术)之外,Word 还支持“模板加载项”。这些可以安装在 Word 启动文件夹中,以便 Word 始终自动加载它们,或者您可以选择让您的加载项显式加载(和卸载)它。

在 Word 对象模型中,这是 Addins 集合。它反映了 Word UI 中的“模板和加载项”对话框。

除了一些“自动”宏之外,“插件模板”中的任何代码(和 RibbonXML 扩展)的行为都与 Normal.dotm 中的代码相同。

使用插件模板代替 Normal.dotm 的优点:

  • 如果 Normal.dotm 损坏或被替换,它不会影响您的代码
  • 您无需在每次启动时检查修改是否存在于 Normal.dotm 中,如果不存在则恢复它
  • 不允许以编程方式访问 VB 项目的安全措施可以保持不变
  • 您不必担心当 Word 崩溃或用户多次登录时会出现臭名昭著的“Normal.dotm 被另一个进程锁定”
  • 代码受到保护,不会被用户修改
  • 如果您需要更改代码,维护更容易
  • 您可以在网络位置使用单个共享模板进行管理

【讨论】:

  • 嘿 Cindy,哦,是的,我知道很多模板插件 - 唯一的事情是我花了很多时间将以前的几个模板插件组合到单个 vsto 以提高启动性能,特别是对于 vpn 用户,我如果它工作得很好,那么每次都插入/重新插入模块并不担心。实际上有一种方法可以通过互操作拦截这些功能吗?还是您认为我走的这条路线几乎是唯一可用的路线?
  • 假设 Office 2007 或更高版本您唯一的其他选择 IMO 是使用 RibbonXML“替换”命令(如果 2010 或更高版本的 Ribbon XML 也可以编辑上下文菜单)。但是除了通过 Windows API 之外,没有办法破解键盘快捷键,键盘快捷键只能“看到”VBA。取决于您的用户如何工作?然而,没有办法真正挂钩这些事件。
  • RE 启动性能:如果您的加载项加载模板而不是将其放入启动中,则不会受到影响。不过,时间问题可能与您现在遇到的问题相同。
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2014-08-12
  • 1970-01-01
相关资源
最近更新 更多