尽管已安装证书,但签名的 Excel VBA 插件 (*.xlam) 无法正常运行

Posted

技术标签:

【中文标题】尽管已安装证书,但签名的 Excel VBA 插件 (*.xlam) 无法正常运行【英文标题】:Signed Excel VBA AddIn (*.xlam) not running properly despite installed certificate 【发布时间】:2020-01-23 08:00:36 【问题描述】:

这是一个艰难的过程。

我们开发了一个 Excel VBA 插件。那是一个 *.xlam 文件。 这个插件非常复杂,可以将 Excel 转换为它自己的软件(嗯,它看起来仍然很像 Excel)。

现在我们希望通过只允许公司内部的签名宏来提高安全性。 所以我们创建了一个证书,签署了我们的 VBA AddIn 宏代码并安装了证书。实际上有两个证书,一个作为受信任的根证书,一个在受信任的发布者列表中。

现在我们要更改 Excel 信任中心的设置,以便只允许运行签名的宏。这对我们所有的 Excel 宏都非常有效 - 除了 AddIn。

这里是棘手的部分。 AddIn 本身会启动并运行。插件检查是否打开了特殊类型的 excel 文件(具有特定自定义属性)并启动初始化过程。 excel 文件本身不包含任何宏(它是 *.xlsx),但它包含许多按钮(形状对象),并且这些按钮通过初始化过程“连接”到插件中的其他过程(子/宏)。

MyWorksheet.Shapes("ShapeName").OnAction = "AddInModuleName.ProcedureName"

此代码将来自 AddIn 的 VBA subs 附加到(无宏)工作表中的形状(按钮)。因此,工作表变得连贯且实用。

当对宏没有限制时,这非常有效。但是在这种情况下,只允许运行签名的宏,代码不会被执行。按钮已失效。

代码本身很好。我可以触发它,例如使用键盘快捷键。但是按钮拒绝运行代码。 我对此的解释是: 通过更改形状的“.OnAction”属性,这本身就被视为代码——至少从安全的角度来看是这样。因此,您可能会争辩说我将“宏”(OnAction 属性)动态添加到 excel 文件中。并且此代码不被视为已签名。它不会继承它创建的代码的安全级别。

不管我是什么原因。尽管代码已签名且受信任,但我的按钮无法正常工作。 任何解决方法的想法(尽管我可能使用 Excel 功能区而不是自制界面)?

【问题讨论】:

我最初的问题是,为什么要限制用户使用 VBA?有很多理由不这样做。一般的Excel用户对VBA一无所知,知道VBA的人也知道不要运行任何在互联网上找到的VBA代码。 该应用程序面向接受此软件特殊培训的有限用户圈。还有很多根本不运行宏的充分理由。这就是为什么微软实现了所有功能来阻止它们运行;) 【参考方案1】:

我明白了。 我发布答案,因为这可能对其他人也很有趣。

这是前提:

    我们有一个 *.xlsx 文件,即没有宏的 excel 文件。 我们有一个经过数字签名并已安装的插件(并且所有证书都已正确安装)。 但此文件中的所有形状对象(按钮)都包含对宏的引用,在本例中是对加载项的引用。此引用存储在每个形状的“OnAction”属性中。 当 Excel 启动时,它会在执行任何代码之前运行安全检查(有意义)。现在 Excel 在形状的“OnAction”属性中找到这些字符串并说:“嗯 - 这很可疑!我最好阻止所有形状。”它不会阻止加载项中的宏代码 - 只是形状(触发器)本身。它会显示一个宏警告(使用默认安全设置)。发生这种情况 - 即使没有可用的宏。如果 OnAction 属性包含任何字符串,Excel 将阻止它。 与此同时,只要安装了所有证书,我的数字签名插件在后台运行良好。但是没有一个按钮能够触发任何代码(键盘快捷键工作正常)。

所以 Excel 对我的加载项没有任何问题。它只是不希望那些 OnAction 属性包含任何字符串。这有点奇怪。如果 Excel 不允许在文件中使用宏。为什么它允许 OnAction 属性。这些也不应该保存在 *.xlsx 文件中。

这是解决方法: 我在加载项中添加了一个 BeforeSave 事件,以清除工作簿中所有形状的所有 OnAction 属性。还有一个 AfterSave 事件,它再次添​​加所有这些字符串。 所以保存的文件会从所有可疑代码中清除。

Excel 打开文件。 该文件通过了安全检查。 在我的加载项代码运行并连接所有形状之后(在所有形状的 OnAction 属性中写入宏调用)和 嗖嗖——所有按钮功能齐全。

所以 Excel 对调用插件宏代码的形状(在 *.xlsx 文件中)没有问题。 如果在运行时添加此代码,则没有问题。 它只是不喜欢在开始的安全检查期间出现那些“呼叫”。

感觉就像是在黑客攻击......

【讨论】:

以上是关于尽管已安装证书,但签名的 Excel VBA 插件 (*.xlam) 无法正常运行的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Excel 插件中出现“无法在证书存储中找到清单签名证书”?

更新后禁用带有证书的宏

由于 Windows 之前冻结,Outlook 宏已禁用

我的CA证书没法用,说是签名失败,如何解决?

Excel中的VBA创建带有表格和签名的电子邮件

如果未安装插件,Excel-VBA 会显示警告