我知道这是一个已经讨论了很多次的话题,人们总是声称:Wix bootstrap 不应该被要求提升。让我解释一下我们的要求,并希望任何人都可以提出适用于所有系统的解决方案。
我们安装的软件是Windows服务,可以提升运行。该服务具有各种设置,这些设置存储在只能由管理员访问的数据库中。安装程序还允许对这些设置进行配置,这是安装程序提升阶段的一部分。这就是问题所在:我们无法在 bootstrap 的未提升阶段从数据库中加载当前设置。
最简单的解决方案是将整个升压器运行在升高的位置,但似乎Wix试图通过设计来努力防止升高的自举程序。在该领域中的所有讨论都产生了更复杂的解决方案,其中在Wix编译之后,随后使用外部工具来嵌入应用程序 list 。
是的,从理论上讲,我们可以对整个数据库凭据进行重新处理,以允许安装程序进行读取访问,但是出于安全原因,我想防止这种情况发生。我们也可以将安装程序的设置副本保存在可读的位置(例如注册表),但这也不便于维护。
是否存在一些干净的Wix内置机制来使用应用程序 list 从一开始加载这些设置或提升 bootstrap ?我们知道提升的 bootstrap 对用户“不好”,但是我们的软件可以解决服务运营商的问题,他们必须拥有管理员权限才能操作我们的软件。
更新#1:我们已经有一个自定义的WPF-GUI,它是利用Wix提供的Microsoft.Tools.WindowsInstallerXml.Bootstrapper.BootstrapperApplication
类作为 bootstrap 的应用程序。
最佳答案
如果不需要提升UI本身,则可以强制提升安装引擎,以便所有的 bootstrap 软件包都将以提升模式安装/执行。
要提升引擎,请使用引擎的Elevate方法(Elevate获取一个'IntPtr hwndParent'参数-我已经使用了窗口的IntPtr,并且效果很好)。
(调用Elevate方法将显示\弹出UAC高程屏幕)
请记住,Elevate方法不是阻塞操作,并且我记得它始终返回true。确定高程是否成功的唯一方法(我找到的方法)是注册到 bootstrap 的Error事件,并检查错误类型是否为ErrorType.Elevate。
请记住,在此解决方案中, UI 本身将保持不升高的状态。
关于Wix bootstrap list 或提升的自定义操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37652588/