如何使用WiX安装程序以提升权限进行安装?

15
我们目前有一个使用WiX 3.5创建的MSI安装程序。该应用程序是.NET 3.5编写的。我们使用MSBuild文件中的boostrapper任务生成引导程序。它指向6.0a SDK文件。
当用户开启UAC并进行安装时,他们必须右键单击setup.exe并选择以管理员身份运行。
我真正想要的是让setup.exe自动提示提升权限(使用我在其他安装中看到的黄色对话框)。
更好的方法是让MSI执行此操作,并完全放弃setup.exe,但我认为这就是WiX 3.6所关注的内容,没错吧?
如果我使用 ApplicationRequiresElevation="true" 创建引导程序,这需要 7.0a SDK,对吗?那么引导程序会自动提示提升权限吗?这是否意味着应用程序必须是 .NET 4 应用程序?我认为不是...
2个回答

16

我们使用了WiX 3.0,并成功进行了权限提升。但是,我们没有为引导程序进行权限提升。我们通过 Package 属性对 MSI 文件本身进行了提升:

<Package Id="$(var.PackageCode)"
         Description="$(var.ProductName) $(var.Version)"
         InstallerVersion="301"
         Compressed="yes"
         InstallPrivileges="elevated"  <!-- Elevated right here -->
         InstallScope="perMachine"
         Platform="x86"/>

顺便提一下,我们的引导程序使用我们官方证书进行签名(使用v6.0A SDK中的signtool.exe)。我不确定这是否会导致引导程序也需要提升权限。

更新:

我们在setup.exe引导程序项目中有一个app.manifest文件,要求可执行文件在管理员级别下运行。请参见以下示例:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"
                xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
                xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
            If you want to change the Windows User Account Control level replace
            the requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            If you want to utilize File and Registry Virtualization for backward
            compatibility then delete the requestedExecutionLevel node.
        -->
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

谢谢,我已经将InstallPrivleges设置成这样了,但似乎没有什么有用的作用。直接运行MSI会失败。哦,但是我刚刚注意到InstallerVersion设置为300。我想那可能是问题所在…… - Jonesie
@Jonesie:如果你明天之前没有得到好的答案,我会在上班时更加仔细地研究我们的资料。也许我能找到更多的信息。 - Jason Down
兄弟,干杯!我需要在我们的构建服务器上运行这个,需要一个小时,所以尝试一件事情需要花费很长时间 :) - Jonesie
@Jonesie:我刚刚远程连接过来看了一下……我们在setup.exe项目中有一个app.manifest文件。它有一个要求引导程序具有管理员权限的部分。请查看我的更新。 - Jason Down
1
自定义操作的Impersonate=yes。移除这个后,修复了CA问题,现在一切运行良好。干杯。 - Jonesie
显示剩余2条评论

3
我知道这是一个旧话题,但希望能为下一个人节省一些时间。
我必须阅读所有的评论,特别是custom action had Impersonate=yes... 另一方面,自定义操作与权限相关的属性是Execute。
<CustomAction Id = "CA.First"  Execute ="immediate" ... />
<CustomAction Id = "CA.Second" Execute ="deferred"  ... />

CA.First 总是在用户模式下执行,但是 CA.Second 可以具有提升的特权。

也许还有其他与权限相关的技巧,
主要的重点是WiX允许在CustomAction级别上控制权限,因此请确保设置正确。

CustomAction元素


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接