如何防止标准 Windows 10 用户的卸载程序提升?

Posted

技术标签:

【中文标题】如何防止标准 Windows 10 用户的卸载程序提升?【英文标题】:How to prevent uninstaller elevating for Standard Windows 10 user? 【发布时间】:2016-05-29 22:02:22 【问题描述】:

我们有一个 x86 Win32 桌面应用程序。当安装程序由标准(非管理员)用户运行时,我们避免提升和/或显示 UAC 提示并安装在 C:\Users\username\AppData\Roaming\... 而不是常见的 Program Files 目录下。

在 Windows 10 上,当我们的卸载程序从 Control Panel -> Programs -> Programs and Features 启动时,不会显示 UAC 提示,并且卸载程序在没有提升的情况下运行。这是期望的行为。从Start -> Settings -> System -> Apps & features 启动相同的卸载程序时,将显示 UAC 提示。

(在 Opera 浏览器安装程序/卸载程序中可以看到相同的行为。我测试了 v35.0.2066.37。)

为什么相同的卸载程序从Apps & featuresPrograms and Features 启动时的行为不同?

从应用和功能启动卸载程序时如何避免UAC提示?

我们的卸载程序的清单包括:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
      <requestedPrivileges>
         <requestedExecutionLevel level="asInvoker" />
      </requestedPrivileges>
   </security>
</trustInfo>

我尝试更改requestedExecutionLevel,还尝试完全删除trustInfo,但无论哪种方式都没有改变行为。

在 Windows 10 版本 1511 build 10586.104 上测试。

编辑: 澄清一下,我要处理的情况是用户拥有标准帐户并且不知道管理员帐户的密码。如果他们在尝试卸载时看到 UAC 提示,他们别无选择,只能取消它,并且我们的卸载程序不会运行。

【问题讨论】:

我刚刚花了一个上午的时间来处理这个“功能”。对我们有用的唯一方法是让卸载程序以当前用户身份重新启动。这是该方法的描述,它使用资源管理器重新启动可执行文件:brandonlive.com/2008/04/27/… 我们使用 NSIS,因此我们能够利用基于第一个链接的 ShellExecAsUser 插件:nsis.sourceforge.net/ShellExecAsUser_plug-in 我想这并不能解决主要问题,但对我们来说,担心的是在提升运行时卸载失败,因为它需要访问 HKCU 和 LocalAppData。这并不能解决防止提升的问题,但即使是 Chrome 的 CurrentUser 安装(如您所述,Opera)在从应用程序和功能卸载时也会在 Windows 10 上遇到相同的提升问题,因此我们认为它足以不失败并以当前用户身份执行,无论它是否已提升启动。 【参考方案1】:

据我所知,这是“应用程序和功能”中的一个错误。 WiX 人员将closed this issue 作为 Windows 错误,我认为他们已经通知了正确的人@Microsoft。不过,Insider build 15042 中的行为仍然相同,因此可能无法在 Creators Update 中及时修复。

如果标准用户无法提升,则无法使用任何解决方法。

如果他们可以提升,那么您可以使用在 cmets 中发布的 re-spawn workaround 或手动加载用户配置文件并调用 RegOverridePredefKey 但它们都是丑陋的黑客(恕我直言)。

【讨论】:

你为我节省了大量的调试,谢谢。 @PawełPolewicz 不确定这是否是临时问题。暂时使用 Archive.org。 该行为取决于 Win 10 的版本。版本 1803 确实显示了该行为,2004 没有,两者之间的版本尚未(尚未)测试。 @Axel 1909 (18363) 也有问题

以上是关于如何防止标准 Windows 10 用户的卸载程序提升?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止应用程序被卸载?

如何删除win10中自带的杀毒软件

如何设置Windows7标准用户的权限?

如何从windows10系统卸载软件

Python 如何获得一个Windows程序窗口,并在窗口里的当前

防止卸载应用程序