【问题标题】:WIX installer UAC is called two times instead of oneWIX 安装程序 UAC 被调用两次而不是一次
【发布时间】:2022-11-29 06:04:16
【问题描述】:

我有一个包含以下包信息的 WIX 安装程序

<Package InstallerVersion="200"
         InstallScope="perMachine"
         Compressed="yes"
         Description="$(var.ProductName)"
         Manufacturer="$(var.ProductManufacturer)"
         InstallPrivileges="elevated"
         Platform="$(var.Platform)"/>  

这导致了这种情况

单击“Installieren”后,UAC 出现并要求管理员权限,这是正确的。

在此安装程序中,我必须运行自定义操作来安装资源管理器 shellextension

<CustomAction Id="RegisterShellExtension"
         Directory="INSTALLDIR"
         ExeCommand='[INSTALLDIR]RegShell.exe --mode register --restartExplorer --path "[INSTALLDIR]$(var.ProductName)ShellExtension.dll"'
         Impersonate="no"
         Execute="deferred"
         Return="ignore">NOT VersionNT64</CustomAction>

<Custom Action="RegisterShellExtensionx" After="InstallFinalize">(NOT VersionNT64) AND (NOT Installed)</Custom>

在 RegShell.exe 的清单中要求管理员权限

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

这就导致了UAC再次请求管理员权限的情况。

是否有可能只提高一次 UAC 而不是两次?

【问题讨论】:

    标签: windows wix windows-installer


    【解决方案1】:

    WiX 不会两次调用 UAC,而是您的自定义操作。必须在 InstallFinalize 之前安排 CA 才能延迟运行。在没有模拟的情况下执行此操作,它们应该已经以 SYSTEM 身份运行,因此没有 UAC 提示。

    顺便说一句,我应该提到这些自注册自定义操作是一种反模式,因为如果它们失败就无法回滚,并且可能会失败并破坏安装程序。通常我们使用注册表项来配置资源管理器。

    比如你的条件是Not VersionNT64。您可能想要添加和 Not REMOVE="ALL" 否则 CA 将尝试在卸载期间触发并失败。哦等等,没关系...你设置 Return="ignore" 所以如果它确实失败了你会把它扫到地毯下并且不知道有问题。

    https://learn.microsoft.com/en-us/windows/win32/shell/reg-shell-exts

    最后,我看到您正在使用 WiX v4(Package 元素而不是 Product 元素。)您应该知道这不是最终的 GA,不应该用于生产安装程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多