权限提升的Installshield自定义操作无法正确运行

时间:2018-10-16 06:41:12

标签: windows-installer installshield custom-action elevated-privileges

我正在使用InstallShield2018。我正在尝试让安装程序在安装结束时执行程序(带有一些命令行参数)。当安装到达应运行程序的位置时,我收到消息:“此Windows Installer软件包存在问题。无法完成安装所需的程序。”(更多详细信息-参见下文)

我尝试执行的程序是我们自己使用C#开发的,并且需要管理员权限才能运行。它具有一个(集成的)清单文件来强制执行此操作。我目前正在使用合并模块进行安装,因为该程序应可在不同软件版本之间重复使用。

为此,我在“ InstallFinalize”(条件为“不可删除”)之前添加了“在系统上下文中延迟执行”自定义操作(类型3682)。我已经在目录表中创建了一个条目,该条目指向可执行文件的安装文件夹,自定义操作的源指向该条目,目标是可执行文件的名称和命令行参数,即:VersionManager .exe /注册“ [[ProductName]” / loglevel信息

返回处理设置为“同步[检查退出代码]”。我尝试将其设置为忽略退出代码-在某种程度上安装似乎没有问题的情况下可以正常工作,但是当我检查日志文件时,它无法运行该程序,并且我看到这样的内容:

MSI (s) (F0:0C) [10:09:49:724]: Executing op: CustomActionSchedule(Action=RegisterAfterInstall,ActionType=1122,Source=C:\Companyname\VersionManager\,Target=VersionManager.exe /Register "Fully parsed product name" /loglevel info,)
MSI (s) (F0:0C) [10:09:49:740]: Note: 1: 1721 2: RegisterAfterInstall 3: C:\Companyname\VersionManager\ 4: VersionManager.exe /Register "Fully parsed product name" /loglevel info 
Info 1721.There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor. Action: RegisterAfterInstall, location: C:\ Companyname\VersionManager\, command:VersionManager.exe /Register "Fully parsed product name" /loglevel info

当我在指定位置(具有管理员权限)运行给定命令时,安装似乎已完成,没有出现问题。我唯一能想到的就是,该程序没有以管理员权限执行。

当消息弹出时检查驱动器时(检查退出代码时),文件实际上存在于系统中(我之前遇到了问题,它产生了另一条错误消息)。

我在某处发现了一条建议将操作类型更改为“在系统上下文中提交执行”的帖子(因为该程序取决于在GAC中注册的.NET内容,并且在installfinalize完成之前显然无法访问),但这并没有帮助

我没有分享我的源代码的自由(或至少不是全部),但是如果以上信息不足,我也许可以建立一个演示相同问题的小示例项目。

>

编辑:

尽管我仍然很好奇为什么上述方法不起作用,但是我设法找到了解决方法。如果我直接(而不是通过合并模块)包含程序文件,并且定义了3602类型的自定义操作(即“随产品一起安装”),则可以正常运行。我没有更早地尝试过此操作,因为我想将其与合并模块一起使用。 (我知道可以在合并模块中定义自定义操作,但随后我无法微调命令行参数)

不过,我仍然不完全明白为什么。

2 个答案:

答案 0 :(得分:0)

在我看来,您正在运行的文件没有必要的依赖关系。例如,如果您运行一个dll并将其放置在二进制表中,则该dll必须没有依赖项。如果指向随产品一起安装的dll,则任何必需的依赖项都应存在于同一文件夹中。
当然,有一些解决方法,但是在产品上安装的一个限制是,您可以按顺序放置它,因为在运行自定义操作之前必须等待安装您的东西。

答案 1 :(得分:0)

实际上没有足够的信息来调试它,因为它基本上是您的程序失败。一些问题往往是:

  1. 该代码与本地系统帐户一起运行,这意味着无法访问某些常用用户的项目。尝试使用HKCU以及任何用户文件夹(例如“用户的应用程序数据文件夹”)或映射的网络驱动器都将无法预测,并导致崩溃。

  2. 该程序未从Windows资源管理器中运行,因此不会设置当前工作目录。您的文件路径需要明确指定(这可能就是“从安装位置运行”的原因)。

您通常不需要在安装时进行注册。该信息几乎总是静态的,可以在构建时提取到(例如)MSI文件的注册表表中。 InstallShield可能为此提供了某种注册设置。