我是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>
怎么做?
答案 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>