使用Registry.LocalMachine.OpenSubKey时的SecurityException

时间:2009-03-24 19:27:07

标签: c# security windows-vista registry

我正在开发一个需要写入注册表的应用程序。它在XP上工作正常,但当我在Vista上运行它时,从Visual Studio中,我得到了一个安全异常:

Registry.LocalMachine.OpenSubKey(“SOFTWARE”,true);

我正在尝试将新密钥写入注册表的该分支。

这样做的正确方法是什么,首先是我可以在Vista上运行我的应用程序,然后我的用户不会遇到在Vista上运行的问题。

...谢谢

5 个答案:

答案 0 :(得分:10)

在XP和Vista上,您需要管理员权限才能在LocalMachine下编写新密钥。

你会发现这在XP上有效,并且由于帐户默认设置不同而在Vista上失败。

快速而肮脏的解决方案是确保您的应用程序在两种情况下都使用管理员权限运行,但在Vista中,这往往是不受欢迎的。

更好的解决方案是稍微重新设计一下 - 新的子密钥可以由安装程序编写(使用管理员权限运行),还是可以将信息存储在其他地方?

答案 1 :(得分:7)

标准用户和在Vista上使用UAC运行的管理员无权编写本地计算机注册表项。如果您以标准用户身份运行,这在XP上也会失败。

您的选择是:

  • 如果设置是按用户,则使用Registry.CurrentUser。
  • 以管理员身份运行您的应用
  • 松开键上的ACL,这样任何人 可写 - 这绝对是 不推荐,因为任何恶意软件 在盒子上可以烘烤钥匙。

答案 2 :(得分:2)

如果您以管理员身份运行,则只能写入该密钥。因此,您需要以管理员身份运行VS,并且您的用户需要以管理员身份运行该应用程序。

我的建议是看你是否真的需要写入LocalMachine。您可以在没有管理员权限的情况下写入CurrentUser。

答案 3 :(得分:1)

我认为它“在XP下工作”,因为每个人都在XP下以Admin管理它?

  • 您可以尝试规避(在安装过程中创建密钥或在CurrrentUser下使用密钥等)。

  • 您可以在安装过程中为您的应用程序授予权限。我担心如何做到这一点的细节还不够。

答案 4 :(得分:-1)

使用Registry.CurrentUser