如何防止标准 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 & features
和Programs 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 用户的卸载程序提升?的主要内容,如果未能解决你的问题,请参考以下文章