以编程方式禁用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不能通过程序禁用,它是为了防止这种行为。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);`