【问题标题】:Run ExeCommand in customAction as Administrator mode in Wix Installer在 Wix 安装程序中以管理员模式在 customAction 中运行 ExeCommand
【发布时间】:2014-08-20 11:47:26
【问题描述】:

我是 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>

怎么做?

【问题讨论】:

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


    【解决方案1】:

    wix documentation here 解释了 Impersonate 属性:

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

    您还需要了解延迟自定义操作和即时自定义操作之间的区别。请参阅同一帮助页面上的 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>
    

    【讨论】:

    • 它向我显示一个错误,因为错误 33 ICE77:comReg 是脚本内自定义操作。它必须在 InstallExecuteSequence 表中的 InstallInitialize 操作和 InstallFinalize 操作之间进行排序@tjleigh
    • 您在哪里安排了自定义操作?查看您的 &lt;InstallExecuteSequence&gt; 元素。如错误所述,它需要在 InstallInitialize 和 InstallFinalize 之间。我可能会把它放在Before="InstallFinalize"
    • @tjleigh:我已经编辑了我的问题,你能帮我解决这个问题吗?!
    • 查看我的编辑,它需要 Before 而不是 After InstallFinalize。
    • Bot里面的元素InstallExecuteSequence(ie) comReg和conUnReg应该只有Before才啊。?
    猜你喜欢
    • 2012-04-19
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2016-06-05
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多