Windows 7提升注册表访问权限

3
我正在为我们的应用程序设计一个安装程序。安装程序会对 HKEY_CURRENT_USER\Software\Company\AppName 注册表键进行一些更改,然后应用程序会在首次运行时查找这些键,根据找到的键执行不同的操作。
这个方法很好用,但当你尝试使用非管理员帐户(即普通用户)在 Windows 7 上安装应用程序时,就会出现问题(可能在 Vista 上也存在,但我还没有测试过)。
当用户尝试安装应用程序时,Windows 会以管理员帐户凭据进行提升。这意味着对注册表中的 HKCU(当前用户)所做的任何更改都会被应用到管理员的注册表键上,而不是启动用户的注册表键上。因此,当应用程序在用户帐户下首次启动时,这些键是不可见的。
我们不可能是唯一需要与其安装的应用程序通信的人。难道没有可靠地使用注册表来实现这一目标的方法吗?
我们不能依赖用户在安装后立即启动应用程序,因此将信息作为命令行参数传递也不是可行的解决方案。我能想到的唯一方法是让安装程序以原始用户身份调用实用程序,该实用程序自己获取或设置注册表键;但是这看起来有点儿麻烦。
注意:应用程序需要在使用完这些键后将其删除,因此我不能将它们放在 HKEY_LOCAL_MACHINE 中。

就此而言,微软通常会修订其建议,不建议将用户设置和配置数据保存在注册表中。如果您不必将其保存在注册表中,为什么不使用像XML或INI文件这样不需要特殊访问权限的东西呢? - Cody Gray
等等,他们真的这样做了吗?那么注册表还有什么用途呢?:( - Colen
1
很多人认为注册表已经没有什么用了。它是在很多年前设计出来的,当时是一个适当的设计,但现在可能已经失去了其有用性,并且其问题似乎已经超过了好处。此外,就算现在有人还在使用注册表,它也只是用于Windows系统,而不是应用程序存储用户数据的地方。关于注册表的现代用途,这里的SO上有其他几个问题,但网络上还有更多错误的信息。这只是需要考虑的事情,在UAC等方面变得更加重要。 - Cody Gray
2个回答

3
你想要的有两种推荐方法:
  1. 使用每个用户安装,不需要管理员权限。你可以使用HKEY_CURRENT_USER,但你的产品不是为所有用户安装的。

  2. 使用每台机器安装,需要管理员权限。在这种情况下,你需要重新设计你的应用程序,让它从配置文件中读取设置。只有在保存特定于用户的设置时才应使用HKEY_CURRENT_USER,而不是全局应用程序设置。

基本上,如果你的应用程序是每台机器的,它应该使用HKEY_LOCAL_MACHINE或配置文件。如果是每个用户,你可以使用HKEY_CURRENT_USER。任何其他组合都有限制,并且不能按照你的需求工作。

2
如果您希望应用程序信息对所有用户可用,请使用HKEY_LOCAL_MACHINE hive。
编辑 - 2种替代方案:
1. 更改注册表键的安全性,以允许用户进行编辑/删除。 2. 使用ProgramData目录(而不是注册表)存储数据。

编辑以添加到原始问题:应用程序需要在使用完密钥后删除它们,因此我不能只将它们放在HKEY_LOCAL_MACHINE中。否则,这是一个很好的建议。 - Colen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接