2014-10-07 37 views
2

我创建了一个C#应用程序,改变“EnableLUA”项设置为0, 应用与管理员权限运行,并没有错误弹出:以编程方式禁用UAC - 更改不生效?

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

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

回答

3

UAC无法以编程方式禁用,它旨在防止这种行为。 UAC的全部观点是,除了用户交互之外,任何其他方式都无法绕过/禁用它。

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

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

更好的解决方案是检测UAC是否启用并指导用户如何打开它关闭。

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

+0

谢谢,我想用管理员权限,这应该是可能的,但它似乎没有。我可以打开UAC窗口,按Tab键两次然后按回车键,但那会非常难看。我只会通知用户。 – John 2014-10-07 15:10:38

+0

您可以将应用程序配置为始终使用exe属性页上的兼容性选项卡运行。你也可以创建一个快捷方式来运行你的应用程序。 例如“提升myprogramsexe.exe” 如果你给你的程序某种安装程序,或者设计一个引导exe文件启动真正的exe文件,你可以去那条路线。用户将从UAC获得一个弹出窗口,但一旦接受并运行,它们将不会再运行,因为它正在运行。 – 2014-10-07 16:02:59

+0

@ @ Ryios感谢您的评论,但即使在运行时,应用程序也会在下次启动应用程序时提示UAC提示。我想知道是否有可能以管理员权限编程禁用UAC,这看起来不可能。 – John 2014-10-08 12:44:32

0

您可以通过简单地写两个代码行中删除UAC提示,

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