我已经在这个问题上工作了好几天但找不到'好'的解决方案,请耐心等待。
该任务正在运行PowerShell脚本,该脚本包含对'netsh advfirewall firewall add ...'的调用,显然这需要提升权限。此外,在此PowerShell脚本中,为成功或失败设置了不同的退出代码。如果定义延迟的WiX自定义操作,一切都很好,即如果成功,则显示成功防火墙更改的对话框,如果失败,则安装回滚。但是,我们的客户喜欢使用安装程序:
“如果PowerShell脚本失败,请不要让MSI安装回滚,但在安装结束时在UI对话框上显示一些不错的警告消息”
为了包装不同的退出代码,我添加了.NET自定义操作以在C#方法中调用Powershell脚本,并尝试将其作为CustomActionData属性传递给MSI安装程序。不幸的是,我无法实现这一点,我相信这是因为延迟操作无法与MSI数据库交互,请参阅此帖子stackoverflow question。
因此,为了从.NET自定义操作中传递退出代码,我认为“立即”操作会设置属性。我知道默认情况下,“立即”操作无法提升,但在.NET自定义操作方法中,我可以强制Powershell脚本在C#方法中以管理员身份运行吗?
总的来说,还有其他方法可以实现我们的目标。回顾一下:
非常感谢任何答案。谢谢。
答案 0 :(得分:1)
也许不使用自己的代码,而是使用防火墙的内置功能:
http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html
Using the firewall extension in WiX
并且必须始终延迟更改系统的自定义操作,以便可以回滚和撤消它们。
您无法选择回滚。如果安装失败,它将回滚!仅当提升整个安装并以管理员身份运行时,才会提升立即自定义操作。同样,这是因为不希望立即CA修改系统,因此不需要提升。
回滚仅与延迟CA松散关联。对于任何安装失败都会发生回滚,而回滚CA是CA撤消已经执行的操作的方式。安装失败和回滚的可能性要求延迟CA具有等效的回滚。虽然如果CA确定其故障严重到足以导致安装失败,CA可能会导致回滚,但回滚是Windows将要执行的操作。 MSI安装是一个事务,目标是它全部工作或全部失败,并且安装保留一个回滚脚本(并保存文件)以将系统恢复到其原始状态。没有人真正想要一个部分安装的产品,对系统进行一些不确定的更改。因此,如果您使用即时CA更改防火墙设置,则无论安装的命运如何,它们都将是永久性的。这也意味着更改防火墙设置的代码需要考虑到先前失败的安装可能已经存在更改的可能性。如果代码被推迟并且没有回滚CA,代码也需要处理这种情况。
如果客户说他们不希望安装回滚,那就相当于说他们想要COM但不想要引用计数。这些东西嵌入在架构和设计中。
答案 1 :(得分:0)
首先,谢谢大家回答我的问题。所有建议听起来都很有希望,我一定会尽快尝试。现在,严格地说,我在这里输入的内容是不直接答案,但只是一种解决方法。
始终返回ActionResult.Success肯定是避免回滚的充分方法。为了使用提升的权限运行,.NET自定义操作将作为“延迟”运行。行动;在.NET自定义动作函数内部,调用Powershell脚本并在脚本返回时获取其退出代码。基于不同的退出代码,MessageBox.Show()用于.NET自定义操作方法,以显示用户Powershell脚本的运行状态。它是一个模态对话框,在安装过程继续之前它会清楚地通知用户。