即使用户具有管理权限,App也无法写入注册表

use*_*326 5 .net c# registry uac .net-2.0

我正在使用Visual Studio 2010,我正在编写一个需要设置(和读取)新注册表值的程序 HKLM\Software\myapp

该程序基于.NET 2.0,目前它在Windows 7 64位上运行.这是我的ocde:

RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("Software", true);
RegistryKey MyKey = softwareKey.CreateSubKey("MyApp");
RegistryKey  = MyKey.CreateSubKey("MyKey");
selfPlacingWindowKey.SetValue("instaldateperson", datestr + usrname);     
Run Code Online (Sandbox Code Playgroud)

我在运行Visual Studio 2010时遇到的问题是,它将运行应用程序但以我身份登录,我是用户和本地管理员组的成员..但是我无法创建密钥(尽管我是本地管理员组的一部分,谁有权这样做).我也不知道如何将其作为登录(但它也不是我想要的,因为那时我会将Adminuser和密码放在代码中,我已经是管理员了 - 所以为什么?)

如果根本不可能,是否有创建注册表项的选项?

不知何故将它们添加到项目中等等......我在这里有点困惑.

Cod*_*ray 9

仅仅因为您以管理员身份运行(或使用具有管理权限的帐户)并不意味着这些管理权限始终有效.这是一项安全措施,可防止恶意软件利用贪婪地使用其计算机并始终具有管理权限的用户.

要获得管理权限,您需要提升流程.有两种方法可以做到这一点:

  1. 使用清单指示您的应用程序需要管理权限,从而在启动时要求提升.

    这意味着您的应用程序将始终运行升级,并且只应在应用程序需要时使用.例如,Windows注册表编辑器(RegEdit)执行此操作,因为没有管理权限,您几乎无法执行此操作.

    在MSDN我的答案中找到有关如何完成此操作的信息.基本上,您只想在清单中添加以下行:

    <requestedExecutionLevel level="requireAdministrator" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您只需要某些任务的管理权限(即,将特定设置保存到注册表)并且应用程序的其余部分不需要它,则应启动新的提升过程来执行此操作.暂时无法提升当前流程,因此您实际上需要分拆新流程.

    此方法的优点是您的应用程序不必始终以管理权限运行(这会增加安全性),并且没有管理权限的用户仍然可以运行您的应用程序来执行其他所有操作(即,除了需要提升的一两个任务之外的所有事情.

    Process使用runas动词分离了一个单独的进程,该进程仅包含使用类和请求提升写入注册表所需的逻辑.有关更多信息,请参阅此问题.我还写了一个答案,提供了如何从C#完成此操作的完整描述,包括示例代码.

当然,正如其他答案所提到的,应用程序的设计更有可能是错误的.Windows安全模型的整个逻辑是常规应用程序不需要管理权限.他们不需要写入注册表或做其他可能危及机器的事情.如果您需要保留设置,我可以建议其他两种可能的方法:

  1. 认识到Windows确实是一个多用户操作系统,只为当前用户编写设置.无论如何,这很有道理,因为不同的用户通常具有不同的设置和偏好.HKEY_LOCAL_MACHINE您可能希望使用而不是注册表的分支(需要管理员权限才能访问)HKEY_CURRENT_USER.将您的第一行代码更改为:

     RegistryKey softwareKey = Registry.CurrentUser.OpenSubKey("Software", true);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过使用.NET内置的逻辑来保留应用程序的设置,完全消除了写入注册表的所有麻烦和复杂性.开始在这里,或在这里,或在MSDN上阅读答案,以了解如何做到这一点.我会说这是你最好的选择.不要自己编写复杂的代码来执行您使用的框架已经内置支持轻松执行的操作.


归档时间:

查看次数:

9827 次

最近记录:

6 年,9 月 前