无法从Vista上的HKEY_LOCAL_MACHINE读取配置数据

我们有一个Java Web Start应用程序,并尝试使用HKEY_LOCAL_MACHINE而不是HKEY_CURRENT_USER来存储应用程序配置数据。 我们可以让具有管理员权限的人第一次启动应用程序并设置配置,以便它成功地将值存储在注册表中。 然而,后来没有管理员权限的Vista用户似乎甚至无法从HKEY_LOCAL_MACHINE的注册表中读取值。

也许我们的方法不正确,并且有更好的方法来存储应用程序配置数据。 有人可以帮忙吗?

您的程序可能会受到注册表虚拟化的影响。

如果32位程序尝试写入HKLM\SOFTWARE下的注册表并且权限不允许写入成功,则Virtualization将启动。程序被告知写入成功,并且数据实际写入HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE 。 然后,当32位程序尝试从注册表中读取时, VirtualStore文件夹中的值将返回到程序。 通过这种方式,该程序被欺骗认为它成功写入了它没有权限的位置,并且32位程序继续在Vista / Windows 7下工作而没有更改。

此外,由于UAC ,管理员用户将被视为非管理员用户,除非专门启动该程序以使用管理员权限运行。 安装程序必须以管理员权限运行,以便他们可以写入HKLM区域。

您通常使用java.util.Preferences在客户端计算机上存储特定于应用程序的数据。 在Windows机器上,这将在幕后写入Windows注册表。 这是Sun教程/指南以及关于该主题的更多技术文章 。

如果您希望获得对Windows注册表的更多访问权限,那么您可能会发现jRegistryKey API很有用,但这当然只有在Windows计算机上而不是Linux / Mac /等上执行webstart应用程序时才有用。 java.util.Preferences API更加抽象。

我可能错了,但非管理员用户无法访问HKLM期间。 读或写。

如果可能,请将您的设置存储在HKCU中。 让应用程序包含默认设置,如果找不到HKCU值,则使用默认值并将其存储在注册表中。 然后,用户应该能够更改这些值。