我有一个 PowerPoint VBA 插件 (ppam 文件),它打包在 MSI 安装程序中,供机器上的所有用户安装。安装后,用户会在 PowerPoint 功能区中获得一些附加按钮来运行插件功能。
不幸的是,一些用户(在学校等组织内的机器上)在功能区中看不到这些按钮,而且虽然 MSI 安装程序运行时没有任何问题,但插件似乎没有加载。
如何安装插件
MSI 安装程序运行(需要管理员权限)。插件进入“C:\Program Files (x86)”中的自己的文件夹。
该插件在注册表的 HKLM 配置单元中启用:“SOFTWARE\Microsoft\Office[POWERPOINT_VERSION_NUM]\PowerPoint\AddIns\NameOfAddin”。[POWERPOINT_VERSION_NUM] 被替换为当前版本,例如“16.0”(来自 HKCR 中的“PowerPoint.Application\CurVer”,后加“.0”)- 自动加载设置为 1,路径设置为 Program Files 目录中 ppam 插件文件的路径。
插件和安装程序均使用 EV 代码签名证书进行签名。
在出现故障的机器上:
- 安装程序运行并且安装出现在应用程序和功能列表中,可以卸载。
- 该插件出现在程序文件目录中。
- 使用备用安装程序 - 使用 inno 安装脚本创建,仅为当前用户安装,修改 HKCU 条目并将插件放入“C:\Users\username\AppData\Roaming\Microsoft\AddIns”中,导致 PowerPoint 打开时插件加载没有问题。
- 信任中心设置 -> 插件中未禁用插件
2021 年 2 月 6 日更新:
早期理论 - 排除 - 组策略设置
我已经能够在组策略编辑器中禁用所有 VBA 插件 - 这与在信任中心设置中看不到标记为禁用的 VBA 插件一致,但是,设置此策略也会禁用每个用户的插件 - 我没有看到。
重现问题
该插件似乎只在机构设备上出现故障,这让我对这个问题的认识出现了错误。同样的问题也发生在某人的笔记本电脑上,没有特殊的安全设置 - 这让我尝试使用 64 位 Office 而不是 32 位 Office 安装该插件:这完全重现了这个问题。
答案1
该解决方案仅涉及对安装程序的一些简单修改(使用 WIX - Windows Installer XML 编写,并使用 Visual Studio 中的 WIX 工具集)。
安装程序被编译为 32 位 - 这意味着加载项在注册表中的 WOW6432Node 下注册 - 对于 32 位 Office 来说,这是正确的位置,但对于 64 位 Office 来说,这是错误的位置。因此,解决方案是将安装程序项目编译为 x64,这样加载项现在就可以在注册表的正确部分注册为 64 位 Office。
添加一个 RegistryKey 元素以将相同的信息放到 WOW6432Node 上,以便该插件也可以在 32 位安装的 Office 上运行(反过来做则不行 - 编译为 32 位并在 HKLM\SOFTWARE 中的非 WOW6432Node 上添加一个密钥)。
将安装目录设置为“ProgramFiles64Folder”(WIX 中的内置常量) - 因此插件始终放置在“Program Files”而不是“Program Files (x86)”目录中。