无法从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值,则使用默认值并将其存储在注册表中。 然后,用户应该能够更改这些值。
- Java(JAXP)XML解析DocumentBuilder的差异
- 如何比较当前时间与时间范围?
- Java中对类的双重generics约束:扩展了ConcreteClass和I.
- 当Base类构造函数在Java中调用重写方法时,Derived类对象的状态
- Java PreparedStatement和ON DUPLICATE KEY UPDATE:如何知道是否插入或更新了行?
- 使用`Runtime.getRuntime()。exec`从Java启动的进程无法访问文件系统位置
- 您是否可以使用Groovy元编程来覆盖Java类上的私有方法
- 为什么我不能从Java中另一个包中的inheritance类调用受保护的方法?
- 关于静态方法的Java编码约定