【问题标题】:Disabling UAC programmatically - Change doesn't take effect?以编程方式禁用 UAC - 更改不生效?
【发布时间】:2014-12-02 01:03:01
【问题描述】:

我创建了一个将“EnableLUA”键更改为 0 的 C# 应用程序, 该应用程序以管理员权限运行,并且没有弹出错误:

//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 突然似乎被禁用了。

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

【问题讨论】:

    标签: c# registry admin uac


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,我认为使用管理员权限应该可以,但似乎不行。我可以打开 UAC 窗口,按两次 Tab 键,然后按 Enter,但这会非常难看。我只会通知用户。
    • 您可以将应用程序配置为始终使用 exe 属性页面上的兼容性选项卡以提升的权限运行。您还可以创建一个快捷方式来运行提升的应用程序。例如“提升 myprogramsexe.exe” 如果你给你的程序提供某种安装程序,或者使用启动真正 exe 的引导 exe 来设计它,你可以走这条路。用户将从 UAC 收到一个弹出窗口,但一旦接受并运行,他们将不再收到,因为它正在运行提升。
    • .@ Ryios 感谢您的评论,但即使在提升运行时,应用程序也会在下次启动应用程序时显示 UAC 提示。我想知道是否可以使用管理员权限以编程方式禁用 UAC,这似乎是不可能的。
    • 组策略可以远程禁用 UAC,并且可能由域管理员以编程方式设置。
    • 是的,您可以使用组策略来做到这一点,但那是因为您所在的域被信任拥有该权力。普通家庭用户不在域中。同样在家庭用户 vpn 在他们自己的机器上工作的情况下,它也不起作用。
    【解决方案2】:

    此版本有效:

    参考:

    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】:

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

      绝对可以禁用 uac,如果您只是将 valuekind 指定为这样的 dword

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

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

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

      【讨论】:

        【解决方案4】:

        写两行代码就可以简单去掉UAC提示,

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

        【讨论】:

        • 对不起 - 我通常不会对事情发表负面评论,但这是个玩笑吗?从字面上看,原始海报在他的问题中提出的内容并只是说行不通。
        • 不得不投反对票,因为更改值不会像正确答案中指出的那样做任何事情。
        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2020-03-22
        • 2014-06-25
        • 1970-01-01
        相关资源
        最近更新 更多