Vista + VB.NET - 写入HKEY_LOCAL_MACHINE时拒绝访问

时间:2009-03-30 17:29:37

标签: vb.net exception windows-vista registry uac

我希望我的程序能够编辑驻留在“HKEY_LOCAL_MACHINE”中的注册表项中的值

    My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\XYZ", "MyValue", "MyData")

以上在Windows XP中运行良好,但在Vista中引发了UnauthorizedAccessException。

3 个答案:

答案 0 :(得分:8)

您正在使用Vista的UAC功能。它不会让您写入HKLM配置单元中的任意位置,因为您没有使用管理权限运行。

有两种方法可以解决此问题

  1. 使用管理权限运行程序(不同于将程序作为具有管理权限的帐户运行)
  2. 选择其他地方(可能是HKCU)来存储数据
  3. 第二个选项要好得多,因为它允许您的应用程序使用非管理员权限运行,而您无法始终认为您的用户具有此权限。

    这是一篇关于UAC的相当详细的文章。它不是100%的编程材料,但它可以很好地解释它到底是什么,并且您可以将它与您的特定程序联系起来:http://technet.microsoft.com/en-us/library/cc709691.aspx

答案 1 :(得分:2)

由于对本地计算机配置单元的更改可能会影响整个系统,因此您会发现对其的更改仅限于非管理用户。如果您尝试在XP计算机上运行相同的代码非管理员帐户,您将收到相同的错误。在Vista上,因为默认情况下该进程是非管理员,您将收到此错误。有关这方面的信息,请参阅“Made for Windows 2000”,“Made for Windows XP”和“Made for Windows Vista”认证指南。

鉴于我几乎没有关于您的计划正在做什么的信息,可能需要更多信息来为您提供具体指导,因此我将在一般情况下发言。除非您需要,否则您希望应用程序单独离开本地计算机配置单元。当您的程序以非管理员模式运行时,您可以禁用需要访问这些管理员密钥的功能,也可以请求admin privs。

答案 2 :(得分:-1)

Vista对管理员帐户的限制更严格。如果您未以管理员帐户登录,则必须写入HKEY_CURRENT_USER而不是HKEY_LOCAL_MACHINE。

IMO,这更有意义。每个用户都有自己的程序设置/ etc。如果您想要为您的程序进行全局设置,则必须使用管理员帐户进行此操作。