没有管理员权限,你可以获得哪些注册表访问权限?

71

我知道我们不应该再使用注册表来存储应用程序数据了,但在更新遗留应用程序时(并希望尽可能少地进行更改),非管理员可以使用哪些注册表子项?

非管理员是否可以访问HKEY_CURRENT_USER的所有内容(应用程序当前正在访问HKEY_LOCAL_MACHINE)而无需管理员权限?


3
我知道我们不应该再使用注册表来存储应用程序数据了,但我认为这不完全正确。相比于文件系统,注册表具有许多优点,并且我不知道有任何微软的指导建议停止在应用程序开发中使用它。也许你不应该使用它来存储大量的应用程序数据,但它是存储设置和配置数据的好地方。 - syplex
我认为微软已经强烈暗示你现在应该使用其他东西,比如XML配置文件,因为他们自己正在这样做。 - O'Rooney
2个回答

111
一般来说,非管理员用户对注册表有以下访问权限:
读/写:
- HKEY_CURRENT_USER
只读:
- HKEY_LOCAL_MACHINE - HKEY_CLASSES_ROOT(它只是一个指向HKEY_LOCAL_MACHINE\Software\Classes的链接)
虽然可以按键来更改其中一些权限,但这种情况非常罕见。您不必担心这个。
对于您的目的,您的应用程序应该将设置和配置写入HKEY_CURRENT_USER。规范的位置可以是在任何地方。
HKEY_CURRENT_USER\Software\YourCompany\YourProduct\

你可以在HKEY_LOCAL_MACHINE中保存全局设置(适用于所有用户)。需要这样做的情况非常罕见,你应该尽量避免。问题在于任何用户都可以“读取”这些设置,但只有管理员(或者说你的安装程序)可以“设置”它们。
另一个常见的麻烦源是你的应用程序不应该写入“Program files”或“Windows”目录中的任何内容。如果你需要写入文件,有几个选择可供选择;详细描述所有选项将需要更长的讨论。所有的选项最终都会将文件写入到用户的%USERPROFILE%下的一个子文件夹或其他位置。
最后,你的应用程序应该避免使用HKEY_CURRENT_CONFIG。这个注册表项保存了硬件配置、服务配置和其他99.9999%的应用程序不需要查看的项目(例如,它保存了当前即插即用设备列表)。如果你需要其中的任何信息,大部分信息都可以通过其他支持的API获得。

3
谢谢。这避免了在MSDN上的一次无果的搜索,尽管提供一个链接会更好。这个问题需要更多曝光。 - Laurie Stearn
2
根据https://learn.microsoft.com/en-us/windows/desktop/winprog64/shared-registry-keys,`HKEY_CLASSES_ROOT`是HKLM\SOFTWARE\Classes和HKCU\SOFTWARE\Classes的合并视图。因此,写入取决于合并源。您可以创建新条目,例如,您可以创建一个自定义协议处理程序而无需管理员特权(已进行测试)。 - djk
我知道这些信息,但是例如Spotify如何在没有管理员权限的情况下安装自己并在HKEY_CLASSES_ROOT、HKEY_LOCAL_MACHINE、HKEY_USERS和HKEY_CURRENT_USER中创建注册表项。更奇怪的是,卸载Spotify需要管理员权限。有什么想法吗? - Cagy79
在64位Windows上,32位应用程序怎么样?是应用程序读取此设置,因此必须位于注册表的32位部分,还是Windows可以保留在64位部分? - bartoli

3
是的,您应该能够在HKEY_CURRENT_USER下写入任何位置而无需管理员权限。但这实际上是一个私有存储区,其他计算机用户将无法访问,所以您不能在那里存放任何共享配置。

1
请注意,对于非管理员用户来说,“HKEY_CURRENT_USER\Software\Policies”是只读的。 - djk
我无法在HKEY_CURRENT_USER中的任何位置保存。包括我在VB6中创建的地方。哪里是保存简单字符串的保证位置? - NeoTechni

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