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

时间:2014-10-07 14:47:17

标签: c# registry admin uac

我创建了一个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似乎突然被禁用了。

这会是某种类型的错误还是仅仅是一种奇怪的安全问题?有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:3)

UAC无法以编程方式禁用,它旨在防止此类行为。 UAC的全部意义在于,除了用户交互之外的任何事情都不可能绕过/禁用它。

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

UAC在操作系统的低级别运行,您的代码必须在内核级别运行才能禁用UAC,因为管理员运行不够。现代bios中的Execute Disable Bit将阻止您的代码以任何方式注入内核(例如缓冲区溢出)

更好的解决方案是检测UAC是否已启用,并指导用户如何将其关闭。

除非你想做一些非常古怪的事情,比如以编程方式打开屏幕以禁用uac并模拟鼠标输入,将滑块单击为无,然后单击“确定”。

答案 1 :(得分:1)

您可以通过编写两行代码

来删除UAC提示
string UAC_key = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System";
Registry.SetValue(UAC_key, "EnableLUA", 0);`

答案 2 :(得分:0)

此版本有效:

参考:

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();

答案 3 :(得分:0)

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

绝对有可能禁用 uac,如果您只是将 valuekind 指定为这样的双字

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

注意你还需要以管理员身份运行程序才能访问regedit中的hklm(HKEY_LOCAL_MACHINE)

在 windows 10 中测试过,它可以工作,我不知道它是否可以在 win7 中运行,但如果可以,请告诉我