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

Dah*_*Sra 22 installer impersonation wix elevated-privileges wix3.7

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

我用Google搜索并发现关键字Elevated Privileges和impersonate可能对我有所帮助.

<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"   InstallPrivileges="elevated"></Package>
Run Code Online (Sandbox Code Playgroud)

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

 <CustomAction Id='comReg' Directory='INSTALLLOCATION'  Impersonate='no'  
  ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]myProduct.dll"  /codebase' Return='check' />
Run Code Online (Sandbox Code Playgroud)

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

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

<InstallExecuteSequence>
  <Custom Action='comReg' After='InstallFinalize'>NOT REMOVE</Custom>
  <Custom Action='comUnreg' Before='RemoveFiles'>REMOVE</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

怎么做?

tjl*_*igh 37

这里wix文档解释了Impersonate属性:

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

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

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

deferred 表示自定义操作在脚本中运行(可能具有提升的权限). immediate 表示自定义操作将在具有用户权限的正常处理时间内运行.这是默认值.

目前,您的自定义操作是立即执行的,这意味着它以用户权限运行.有关详细信息,请参阅此博客文章,但特别是:

任何立即的自定义操作都会模拟调用用户.在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' />
Run Code Online (Sandbox Code Playgroud)

编辑:使用InstallExecuteSequence元素计划自定义操作:

<InstallExecuteSequence>
    <Custom Action='comReg' Before='InstallFinalize'/>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)