在Wix Installer中以管理员模式在customAction中运行ExeCommand

时间:2014-06-30 06:56:06

标签: wix installer impersonation wix3.7 elevated-privileges

我是wix安装程序的新手。我已经为我的应用程序使用wix安装程序开发了一个设置,我需要执行自定义操作以在cmd.exe中运行命令。在XP中它工作正常。但在Windows 8& 7 cmd提示符需要以管理员身份运行。

我用Google搜索并发现关键字提升权限和模拟可能对我有所帮助。

<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"   InstallPrivileges="elevated"></Package>

如上所示,我使用了设置为perMachine的InstallScope属性,并且我在CustomAction元素中使用了Impersonate =“No”:

 <CustomAction Id='comReg' Directory='INSTALLLOCATION'  Impersonate='no'  
  ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]myProduct.dll"  /codebase' Return='check' />

但是在安装时我没有得到任何改变。我需要命令提示符以管理员模式打开并运行上述命令。

任何人都可以告诉我这些关键字“提升权限和模仿”

<InstallExecuteSequence>
  <Custom Action='comReg' After='InstallFinalize'>NOT REMOVE</Custom>
  <Custom Action='comUnreg' Before='RemoveFiles'>REMOVE</Custom>
</InstallExecuteSequence>

怎么做?

1 个答案:

答案 0 :(得分:34)

wix documentation here解释了Impersonate属性:

  

此属性指定在执行此自定义操作时,作为LocalSystem执行的Windows Installer是否应模拟安装用户的用户上下文。通常,该值应为“是”,除非自定义操作需要提升权限以将更改应用于计算机。

您还需要了解延迟和即时自定义操作之间的区别。请参阅同一帮助页面上的Execute属性:

  

此属性指示自定义操作的计划。此属性的值必须是以下值之一:

     

<强>推迟      表示自定义操作在脚本中运行(可能具有提升的权限)。   的立即      表示自定义操作将在具有用户权限的正常处理时间内运行。这是默认值。

目前,您的自定义操作是即时的,这意味着它以用户权限运行。有关详细信息,请参阅this blog post,但特别是:

  

任何立即自定义操作都会模拟调用用户。在Windows Vista之前,这不是问题,因为此时安装管理用户有一个特权令牌。通过在Windows Vista中引入UAC,启用了UAC的默认管理令牌是已过滤的令牌,并且不具有所有权限。由于立即自定义操作不应该修改机器状态 - 仅收集状态数据并安排自定义操作以延迟运行 - 这仍然不应该是一个问题。毕竟,此时安装和回滚脚本的生成应该继续进行。

您永远不应该使用即时自定义操作修改计算机状态。使用延迟的,并将模拟保持为否,它应该起作用:

<CustomAction Id='comReg' Directory='INSTALLLOCATION' Execute='deferred' Impersonate='no' ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]EAWordImporter.dll" /codebase' Return='check' />

编辑:使用InstallExecuteSequence元素安排自定义操作:

<InstallExecuteSequence>
    <Custom Action='comReg' Before='InstallFinalize'/>
</InstallExecuteSequence>