以编程方式禁用UAC

19

在Vista中,是否有可能以编程方式禁用UAC?或者,我可以以任何方式使我的应用程序在UAC设置下无限制地运行吗?FYI,该应用程序需要动态挂载硬盘,这就是为什么我不能每次询问UAC权限的原因...

更新:

我正在寻找类似于Kosi2801提到的东西,基本上是要求用户始终以“提升的”模式启动程序。我希望权限只需一次性获取,我并不是说可以在未经允许的情况下以编程方式禁用UAC。我相信有很多需要以此模式运行的程序(特别是硬件相关的程序),因此应该有某种方法来容纳它。


正确的解决方案是安装一个服务来代表您执行管理员级别的任务。 - Harry Johnston
我创建了一个基于服务的应用程序来关闭UAC,请看一下我的回答。 - Zach Leighton
如果您会使用C#编程,您可以获取以下URL提供的帮助:https://dev59.com/KnRB5IYBdhLWcg3wQFLu - Sami
UAC 是用户的偏好,而不是你的。你还必须考虑到禁用 UAC 并不能解决你的问题。当用户是标准用户时,程序仍然无法以管理员权限运行。你必须问问自己:在 Windows XP 上你会怎么做?用户是标准用户,你必须正确处理。 - Ian Boyd
真正的问题是为什么你需要一直以管理员权限运行该程序。解决这个问题,你就不需要禁用用户账户控制(这是不推荐的做法)了。 - undefined
8个回答

18
在下面的路径中将EnableLUADWORD值设置为0,然后重新启动。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 

这将毫无问题地禁用UAC,我建议您对所有用户都这样做,是否经过许可由您决定,因为Vista的UAC实在是太糟糕了,我相信越少人使用它越好(仅限于Vista),在Win7中已经改善了。
玩得开心,享受我的注册表技巧吧!
在Win7中也适用,告诉我您使用它的情况如何。

1
+1 分钟的技巧,但是用户账户控制(UAC)会让我们修改 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 中的注册表值而不警告接收端用户吗? - Omair Iqbal
1
只要您在管理员权限下运行程序(exe),那么实际上您可以在不通知用户的情况下进行注册表操作,在VISTA和Win7中,您仍然可以这样做,但用户会收到通知,提示“您需要重新启动计算机才能使UAC生效”- 这不会中断过程,只是向用户暗示禁用已发生...但如果您想要,也可以使用另一种注册表技巧关闭该消息:),因此,只要以管理员身份运行,它总是“有效”的。 - Erx_VB.NExT.Coder
11
为了让一个单独的应用程序更容易处理一个(可以避免的)问题,全局禁用UAC是不必要的。为什么不干脆卸载所有病毒扫描器,因为它们警告得太频繁?在我看来,降低安全性以增强可用性永远不是解决方案。 - Kosi2801
2
我认为这在技术上是正确的答案,但我不建议任何人使用这种方法,因为它基本上违背了其他人在此处所述的UAC的目的。如果您在自己/内部/企业环境中进行操作,则可能没有问题... - Abdullah Jibaly
你缺少需要设置的其他3个注册表键。 - Zach Leighton
显示剩余4条评论

15
你无法以编程方式禁用UAC,但你可以从一开始就强制程序以提升的权限运行,这样它就不会每次都提示。
这将导致它在启动时提示一次,但不会每次需要访问时都提示。
要做到这一点,你需要创建一个清单文件并设置。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false">

请参阅MSDN获取详细信息。


嗨,里德, 我正在制作一个安装程序(具有上述权限),它运行ServiceModelReg.exe,但最终出现错误...而手动从控制面板提升权限运行它时...一切正常。 - taher chhabrawala
阅读我的答案,只要您在管理员权限下运行,就可以禁用UAC! - Erx_VB.NExT.Coder
@Erx_VB.NExT.Coder:虽然这会强制重启,但我不认为这是一种编程式的改变,而是一种配置上的改变。这并不能真正帮助到我们,因为用户仍然可以在这种情况下更改系统配置。 - Reed Copsey
我只是很烦恼每个人都说禁用UAC是不可能的,而事实上这根本不是真的。错误信息才是问题所在。如果您处于管理员或提升模式下(大多数运行应用程序都是如此),则可以使用注册表禁用UAC。 - Erx_VB.NExT.Coder
@Erx_VB.NExT.Coder:如果您拥有提升的权限,您可以为整个用户帐户执行此操作,但无法针对特定操作/进程执行。这还需要提升的权限(即UAC提示)才能执行... - Reed Copsey

9

UAC的目的是防止执行不需要的应用程序。如果可以通过编程方式禁用它,那么它就没有价值了。


3
只要你以管理员身份运行,这是可能的。 - Erx_VB.NExT.Coder

3

我在这里发布了一个有点细节化(但很丑)的解决方案。

http://stackoverflow.com/questions/5344021/bypass-uac-in-vbscript/34445992#34445992

只有在任务计划程序中启动应用程序时才能起作用。我已经在两台Windows 7笔记本电脑上运行它。这是一种管理解决方案。你需要管理员特权来实施它。我用它来处理powershell和我的UPS电源备份应用程序。我怀疑我会发现其他用途。


是否有特别的原因导致了负面评价?我的解决方案以一种迄今未见的方式禁用了UAC。这是我尝试解决3年的问题。这个解决方案是有效的。 - namrokretep

1
我创建了一个小应用程序来完成这个任务,但基本上你需要设置4个注册表键值。
C# 示例:
Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System","EnableLUA", 0);

Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", "ConsentPromptBehaviorAdmin", 0);

Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", "PromptOnSecureDesktop", 0);

Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Action Center\\Checks\\{C8E6F269-B90A-4053-A3BE-499AFCEC98C4}.check.0", "CheckSetting", StringToByteArray("23004100430042006C006F00620000000000000000000000010000000000000000000000"), RegistryValueKind.Binary);

我的应用程序每5分钟作为服务运行,以"对抗"组策略,这对于开发人员的计算机来说是一个绝对的烦恼。

https://github.com/zleight1/DisableUAC


0

以编程方式禁用UAC将会破坏其目的,因为这样也可以被恶意软件、蠕虫、木马和病毒所做,并且根本没有真正的安全效果。

您可以要求在管理员帐户下运行您的应用程序或(我认为)让Microsoft以某种方式签署您的应用程序。

可能还有其他我不知道的方法,但它们都不能以编程方式实现!


当然可以禁用UAC及其相关消息,只要您在管理员权限下运行程序! - Erx_VB.NExT.Coder
由于问题涉及到当前以受限制的方式启动应用程序,因此在这种情况下不可能实现。当然,正如我所说的,要求以管理员权限启动它就可以解决问题。而且,既然不必每次手动执行,答案仍然适用。因此,被接受的答案——如何自动启动提升模式是正确的选择。 - Kosi2801
我相信我的答案已经更新为正确答案,因为他们询问如何摆脱UAC问题,而这正是我的答案所做的。虽然这是最后的手段,但它是准确的。他将被接受的答案更改为我的答案。 - Erx_VB.NExT.Coder

0

用户账户控制(UAC)就像城市里使用信号量一样是必要的邪恶。我建议适应新的范式。我个人不喜欢UAC,但我理解其目的和好处。不幸的是,我们都创造了这个怪物。让我们回到1983年,简要评估这些年来的变化,然后我们就会理解。当然,如果意图是私人使用,如上所述,任何事情都有可能,但这将是有风险的并成为一个黑洞责任。


-1

这会违背用户账户控制(UAC)的初衷。所以,不能这样做。


因为如果他能够做到,那么拥有它就毫无意义。 - sɐunıɔןɐqɐp

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