Wix Bootstrapper 清单或提升的自定义操作

Posted

技术标签:

【中文标题】Wix Bootstrapper 清单或提升的自定义操作【英文标题】:Wix Bootstrapper manifest or elevated custom action 【发布时间】:2016-06-06 08:18:25 【问题描述】:

我知道这是一个已经被讨论过很多次的话题,人们总是声称:Wix 引导程序不应该要求提升运行。让我解释一下我们的要求,希望任何人都可以提出一个适用于所有系统的解决方案。

我们安装的软件是运行提升的 Windows 服务。该服务具有各种设置,这些设置存储在只能由管理员访问的数据库中。安装程序还允许配置那些作为安装程序提升阶段的一部分完成的设置。这就是问题所在:我们无法在引导程序的未提升阶段从数据库中加载当前设置。

最简单的解决方案是将整个引导程序提升运行,但似乎 Wix 密集地试图通过设计来防止提升引导程序。该领域的所有讨论都导致了奇怪的解决方案,即在 Wix 编译之后使用外部工具嵌入应用程序清单。

是的,理论上我们可以修改整个数据库凭据以允许安装程序读取访问权限,但出于安全原因,我想防止这种情况发生。我们还可以将安装程序设置的副本保存在可读位置(例如注册表),但这也不好维护。

是否有一些干净的 Wix 内置机制来加载这些设置或使用应用程序清单从一开始就提升引导程序?我们知道提升的引导程序对用户来说“不好”,但我们的软件解决了服务运营商无论如何必须拥有管理员权限才能操作我们的软件。

更新 #1:我们已经有一个自定义 WPF-GUI 作为引导程序应用程序,它利用 Wix 提供的 Microsoft.Tools.WindowsInstallerXml.Bootstrapper.BootstrapperApplication 类。

【问题讨论】:

当我需要运行 bootstrapper 提升时,我只是从源代码重建它并更改了几个清单文件。对于以这种方式构建的 Wix 3.10,需要 VS 2015 并启用 Windows XP 对 C++ 的支持。如果您真的需要遵循它,我可以这样描述。 我可能忘记提到的是,我们已经在使用Microsoft.Tools.WindowsInstallerXml.Bootstrapper:BootstrapperApplication 构建自己的用户界面;我不确定这是否对这个主题有任何影响。可以将此自定义引导程序构建作为解决方案一部分的普通项目,还是使用您的方法创建的完整自定义 Wix 构建? 没有区别。重建后,您必须将文件夹中的原始 burn.exe 替换为 wix 二进制文件,之后使用此二进制文件构建的所有引导程序应用程序将在启动时要求提供凭据。 对于我来说,完全重新编译 Wix 并使用自定义二进制文件,这听起来像是一个极端的解决方案。我在Wix repository 上看到他们在这个话题上有一个 2 年的问题,没有任何进展。 这就是为什么我在第一条评论中说如果我的解决方案适合您,我可以提供帮助:) 即使您将重新编译 WIX,您也只能从中得到一个 burn.exe,只有清单改变了。 【参考方案1】:

如果 UI 本身不需要提升,您可以强制安装引擎提升,以便所有引导程序包都将在提升模式下安装\执行。

要提升引擎,请使用 Engine 的 Elevate 方法(Elevate 获取 'IntPtr hwndParent' 参数 - 我使用了窗口的 IntPtr,效果很好)。

(调用 Elevate 方法将显示\弹出 UAC 海拔屏幕)

请记住,Elevate 方法不是阻塞操作,我记得它总是返回 true。确定提升是否真正成功的唯一方法(我发现)是注册到引导程序的错误事件并检查错误类型是否为 ErrorType.Elevate。

请记住,在此解决方案中,UI 本身不会被提升。

【讨论】:

你有没有样品如何提升方法?

以上是关于Wix Bootstrapper 清单或提升的自定义操作的主要内容,如果未能解决你的问题,请参考以下文章

WiX Burn Bootstrapper 不调用 OnDetectRelatedBundle

WiX-Bootstrapper - 为 UAC 对话框设置产品名称和公司名称

WiX Bootstrapper 项目结构

WiX Bootstrapper:如何从命令行设置刻录变量?

从 Wix Bootstrapper Bundle 检查文件版本

自定义 Bootstrapper UI,类似于自定义的 wix UI