1

我有一个用于 32 位应用程序的安装程序包(使用 MakeMsi 构建,最初用于 Windows XP,并且从那时起进行了简单维护),它无法在现代(64 位)Windows 系统(7、8、10)上注册 COM 服务器. 这是我在尝试正常安装我的 MSI 时看到的:

COM注册错误截图

应用程序错误

模块 xyz 中的异常 EOleSysError 位于 000F0B01。访问 OLE 注册表时出错。

如果我将 MSI 带入兼容模式Windows 以前的版本,COM 服务器注册成功。由于不知何故“它起作用了”,到目前为止,我没有花太多时间来探索原因。但最后,我已经筋疲力尽地一次又一次地记住我们的客户(有时也是我)这个前提条件,所以我希望解决这个问题。

注册(和取消注册)是通过CustomAction完成的,正如我使用 Orca 看到的那样:

"[INSTALLDIR.MYAPP]\placeholder.exe" -regserver
"[INSTALLDIR.MYAPP]\placeholder.exe" -unregserver

对于这些条目中的每一个,Typeis1122Sourceis INSTALLDIR.MYAPP

我可以想象COM服务器在安装过程中是在权限不足的情况下启动的,但是安装程序不是以管理员权限自动运行的吗?我的意思是,当我(作为标准用户)通过双击启动安装程序时,它会在实际安装发生之前显示 UAC 提示。为什么 COM 服务器没有以提升的注册和注销权限运行?很混乱...

我应该如何更改我的 MSI 以使 Windows 安装程序成功处理它?

4

2 回答 2

2

我假设您知道问题出在您作为自定义操作运行的可执行文件中,而不是 Windows Installer 中的任何内容。这意味着问题将出在可执行文件中的代码上,它可能很旧并且与更高版本的操作系统不兼容。您需要查看代码以了解它在做什么不受支持。

许多安装不需要自行注册。该数据是可以提取一次并包含在注册表项和其他 COM 类表中的 MSI 文件中的所有静态数据。这意味着在安装过程中根本不需要运行代码。

于 2016-08-03T20:04:35.113 回答
0

在学习了如何正确注册 COM 服务器之后,我仍然有兴趣了解,为什么我的 MSI 包以前可以工作。换句话说:Windows XP 之后的关键变化是什么?
...同时,当我以管理员身份运行 MSI 时,我还检查了它是否正常工作...

正如我在阅读 WiX 工具集文档时发现的那样,有一个属性Impersonate可以CustomAction控制 CA 是否以提升的权限执行:

此属性指定作为 LocalSystem 执行的 Windows 安装程序在执行此自定义操作时是否应模拟安装用户的用户上下文。通常,该值应为“是”,除非自定义操作需要提升权限才能将更改应用于计算机。

它指的是Table字段中的msidbCustomActionTypeNoImpersonate标志。我在 MSI 中观察到的值被反编译成:TypeCustomAction1122

我用来“解决”问题的快速方法是,在 CA 类型中启用msidbCustomActionTypeNoImpersonate标志 ( 2048)(在 WiX 中这将是Impersonate="no")。

翻译成我的MakeMsi脚本,我必须使用SystemTypeExeCa命令中的属性来使自我注册像以前一样工作:

Type="Deferred Sync AnyRc System"

我完全知道这只是一种解决方法,因为为(取消)注册运行 COM 服务器是危险的。所以应该首选PhilDWs答案第二部分中提到的解决方案:通过MSI中的注册表项管理与COM相关的静态信息。但有时您需要一个快速的解决方案,有时没有其他选择,请参阅Euro Micellis 评论

于 2016-08-04T09:55:00.970 回答