以编程方式禁用UAC-更改不会;t生效

本文关键字:生效 编程 方式禁 UAC- | 更新日期: 2023-09-27 18:25:45

我创建了一个C#应用程序,它将"EnableLUA"键更改为0,该应用程序以管理员权限运行,不会弹出任何错误:

//Runs with admin rights
try 
{
RegistryKey key = 
Registry.LocalMachine.OpenSubKey(@"SOFTWARE'Microsoft'Windows'CurrentVersion'Policies'System", true);
            key.SetValue("EnableLUA", "0");
            key.Close();
}
catch(Exception e)
{
    MessageBox.Show("Error: " + e);
}

注册表项确实从1更改为0,但即使在重新启动计算机后,UAC仍处于启用状态。然后,当我转到"控制面板">"用户帐户控制"时,滑块会一直向下转动。当按下"保存"(并且没有修改任何内容)时,UAC似乎突然被禁用了。

这是某种bug还是一种奇怪的安全性?有办法解决这个问题吗?

以编程方式禁用UAC-更改不会;t生效

UAC不能通过程序禁用,它是为了防止这种行为。UAC的全部目的是让除了用户交互之外的任何东西都不可能绕过/禁用它

当然,您可以将注册表项设置为0,并且可以看到滑块被移动,但除非用户实际上是导致该操作的人(用"确定"提交),否则它不会更新。

UAC在操作系统的低级别运行,您的代码必须在内核级别运行才能禁用UAC,以管理员身份运行是不够的。在现代bios中执行禁用位将防止您的代码使用任何类型的方法(例如缓冲区溢出)注入内核

一个更好的解决方案是检测是否启用了UAC,并指导用户如何关闭它

除非你想做一些非常古怪的事情,比如用程序打开屏幕禁用uac,并模拟鼠标输入,点击滑块向下至无,然后点击ok。

此版本有效:

参考:

using System.Management.Automation;

代码:

var script = PowerShell.Create();
script.AddScript("Set-ItemProperty '"HKLM:''SOFTWARE''Microsoft''Windows''CurrentVersion''Policies''System'" -Name '"ConsentPromptBehaviorAdmin'" -Value '"0'" ");
script.Invoke();

您正在将32位DWORD更改为字符串值,因此它不起作用

如果您只为像这样的数据字指定valuekind,那么禁用uac是完全可能的

key.SetValue("EnableLUA", "0", RegistryValueKind.DWord);

注意,您还需要以管理员身份运行程序,以便程序在regedit中访问hklm(HKEY_LOCAL_MACHINE)

在windows 10中测试并工作,我不知道它是否在win7中工作,但让我知道它是否工作

尽管UAC警告它只有在OK之后才能工作,但这不是行为,windows假设发生了更改并禁用了UAC,我对它进行了测试,这是因为windows 10 中缺少DWORD

您只需编写两行代码即可删除UAC提示,

string UAC_key = @"HKEY_LOCAL_MACHINE'SOFTWARE'Microsoft'Windows'CurrentVersion'Policies'System";
Registry.SetValue(UAC_key, "EnableLUA", 0);`