Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已签名的Excel VBA加载项(*.xlam)未正确运行,尽管已安装证书_Excel_Vba_Excel Addins - Fatal编程技术网

已签名的Excel VBA加载项(*.xlam)未正确运行,尽管已安装证书

已签名的Excel VBA加载项(*.xlam)未正确运行,尽管已安装证书,excel,vba,excel-addins,Excel,Vba,Excel Addins,这是一个艰难的过程 我们开发了一个Excel VBA插件。这是一个*.xlam文件。 这个插件相当复杂,它可以将Excel转换成自己的软件——它看起来仍然很像Excel 现在,我们希望通过在公司内部只允许签名宏来提高安全性。 因此,我们创建了一个证书,签署了VBA加载项宏代码并安装了证书。实际上有两个证书,一个作为受信任的根证书,另一个在受信任的发布者列表中 现在我们要更改Excel信任中心中的设置,以便只允许运行已签名的宏。这对我们所有的Excel宏都非常有效——除了AddIn 棘手的部分来了

这是一个艰难的过程

我们开发了一个Excel VBA插件。这是一个*.xlam文件。 这个插件相当复杂,它可以将Excel转换成自己的软件——它看起来仍然很像Excel

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

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

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

MyWorksheet.ShapeShapeName.OnAction=AddInModuleName.ProcedureName

此代码将VBA SUB从加载项附加到无宏工作表中的“形状”按钮。因此,工作表变得有线和功能

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

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

不管我的理由是什么。我的按钮不起作用,尽管代码是经过签名和信任的。 尽管我可以使用Excel功能区而不是自制的界面,但有什么解决办法吗?

我明白了。 我把答案贴出来,因为其他人也可能对此感兴趣

这是前提:

我们有一个*.xlsx文件,换句话说,是一个没有宏的excel文件。 我们已正确安装了数字签名和安装的加载项以及所有证书。 但是,此文件中的所有形状对象按钮都包含对宏的引用,在本例中是对外接程序的引用。此引用存储在每个形状的OnAction属性中。 当Excel启动时,它会在执行任何代码之前运行安全检查。现在Excel在形状的OnAction属性中找到这些字符串,并说:嗯,这是可疑的!我最好挡住所有的形状。它不会阻止外接程序中的宏代码,只是触发器本身的形状。并显示一个带有默认安全设置的宏警告。即使没有可用的宏,也会发生这种情况。如果OnAction属性包含任何字符串,Excel将阻止它。 同时,如果安装了所有证书,我的数字签名加载项在后台运行良好。但是没有一个按钮能够触发任何代码键盘快捷键工作正常。 所以Excel对我的外接程序没有问题。它只是不希望那些OnAction属性包含任何字符串。这有点奇怪。如果Excel不允许在文件中使用宏。为什么它允许OnAction属性。这些文件也不应保存在*.xlsx文件中

这是解决办法: 我在外接程序中添加了BeforeSave事件,以清除工作簿中所有形状的所有OnAction属性。以及一个AfterSave事件,它再次添加所有这些字符串。 因此,保存的文件将从所有可疑代码中清除

Excel将打开该文件。 该文件通过了安全检查。 然后,我的外接程序代码运行并连接所有形状,并在所有形状和形状的OnAction属性中写入宏调用 嗖-所有按钮功能齐全

所以Excel对调用外接程序宏代码的*.xlsx文件中的形状并没有问题。 如果在运行时添加此代码,则没有问题。 它只是不喜欢那些电话在一开始的安全检查中出现


感觉就像黑客一样……

我的第一个问题是,为什么要限制用户使用VBA?有很多理由不这样做。一般Excel用户对VBA一无所知,知道VBA的人也知道不要运行在互联网上找到的任何VBA代码。该应用程序针对的是接受过该软件专门培训的有限用户群体。还有很多很好的理由不运行宏。这就是为什么微软实施了所有的功能来阻止它们运行;