是否有可能在 WiX .NET 自定义操作方法中提升即时自定义操作

Is that possible to elevate immediate Custom Action in WiX .NET custom action method

我已经处理这个问题好几天了,但找不到 'good' 解决方案,请耐心等待。

任务是 运行 包装对 'netsh advfirewall firewall add ...' 的调用的 PowerShell 脚本,显然这需要提升权限。此外,在此 PowerShell 脚本中,为成功或失败设置了不同的退出代码。如果定义一个延迟的 WiX 自定义操作,一切都很好,即如果成功,一个关于成功的防火墙更改的对话框显示,如果失败,安装回滚。但是,我们的客户喜欢安装程序:

"Don't let MSI installation rollback if PowerShell script fails, but show some nice warning message on UI dialog at the the end of installation"

为了包装不同的退出代码,我添加了 .NET 自定义操作以在 C# 方法中调用 Powershell 脚本,并尝试将其作为 CustomActionData 属性 传回 MSI 安装程序。不幸的是,我无法做到这一点,我相信这是因为延迟操作无法与 MSI 数据库交互,请参阅此 post Whosebug question

因此,为了从 .NET 自定义操作返回退出代码,我认为 'immediate' 操作会设置属性。我知道默认情况下,无法提升 'immediate' 操作,但是在 .NET 自定义操作方法中如何,我可以强制 Powershell 脚本在 C# 方法中作为管理员 运行 吗?

总的来说,有没有其他方法可以达到我们的目的。回顾一下:

  1. 运行 具有提升权限的 PowerShell;
  2. 如果 Powershell 脚本失败,请不要回滚安装,而是使用不同的 Powershell 脚本退出代码显示不同的 UI。

非常感谢任何回答。谢谢你。

首先感谢大家回答我的问题。所有建议听起来很有希望,我一定会尽快尝试。目前,严格来说,我在这里输入的内容 不是 直接答案,而只是一种解决方法。

总是return ActionResult.Success肯定是避免回滚的充分方法。为了 运行 具有提升的权限,.NET 自定义操作是 运行 作为 'deferred' 操作;在 .NET 自定义操作函数中,Powershell 脚本被调用,其退出代码作为脚本 return 获取。基于不同的退出代码,MessageBox.Show() 在.NET 自定义操作方法中用于显示用户 Powershell 脚本 运行ning 状态。它是一个模态对话框,在安装过程继续之前明确通知用户。

也许不使用您自己的代码,而是使用防火墙的内置功能:

http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

Using the firewall extension in WiX

必须始终推迟更改系统的自定义操作,以便它们可以回滚和撤消。

您没有关于回滚的选择。如果安装失败,它将回滚!仅当提升整个安装且 运行 为管理员时,才会提升即时自定义操作。同样,这是因为直接 CA 预计不会修改系统,因此不需要提升。

回滚仅与延迟的 CA 松散相关。任何安装失败都会发生回滚,回滚 CA 是 CA 撤消它们已经完成的操作的方式。安装失败和回滚的可能性要求延迟的 CA 具有回滚等效项。如果 CA 认为他们的失败严重到足以导致安装失败,他们可能会导致回滚,回滚是 Windows 无论如何都会做的。 MSI 安装是一个事务,目标是全部工作或全部失败,并且安装保留回滚脚本(并保存文件)以将系统恢复到其原始状态。没有人真的想要部分安装的产品对系统进行一些不确定的更改。因此,如果您使用直接 CA 更改防火墙设置,它们将是永久性的,无论安装结果如何。这也意味着您更改防火墙设置的代码需要考虑到更改可能已经存在于先前失败的安装中的可能性。如果它被推迟并且没有回滚 CA,代码也将需要处理这种情况。

当客户说他们不希望安装回滚时,这相当于说他们想要 COM 但不想要引用计数。这些东西嵌入在架构和设计中。