如何使用Preferences.systemRoot()
编写系统首选项?
我尝试过:
Preferences preferences = Preferences.systemRoot();
preferences.put("/myapplication/databasepath", pathToDatabase);
但我收到此错误消息:
2010-maj-29 19:02:50 java.util.prefs.WindowsPreferences openKey
VARNING: Could not open windows registry node Software\JavaSoft\Prefs at root 0x80000002. Windows RegOpenKey(...) returned error code 5.
Exception in thread "AWT-EventQueue-0" java.lang.SecurityException: Could not open windows registry node Software\JavaSoft\Prefs at root 0x80000002: Access denied
at java.util.prefs.WindowsPreferences.openKey(Unknown Source)
at java.util.prefs.WindowsPreferences.openKey(Unknown Source)
at java.util.prefs.WindowsPreferences.openKey(Unknown Source)
at java.util.prefs.WindowsPreferences.putSpi(Unknown Source)
at java.util.prefs.AbstractPreferences.put(Unknown Source)
at org.example.install.Setup$2.actionPerformed(Setup.java:43)
我想这样做,因为我想安装嵌入式JavaDB数据库,并让计算机上的多个用户与该应用程序使用相同的数据库。
如何解决这个问题?我可以从Java调用UAC并以管理员身份执行此操作吗?如果我在编写时以管理员身份登录,如果我以用户身份登录,是否可以使用Java应用程序读取值?
答案 0 :(得分:2)
您无法从java首选项写入任何任意注册表位置 - 所有首选项都存储在子项Software\Javasoft\Prefs
下。用户首选项映射到HKEY_CURRENT_USER配置单元,系统映射到HKEY_LOCAL_MACHINE
配置单元。
要写入注册表,可以使用windows“REG”命令行工具。 This page详细介绍了修改注册表的其他方法。包括使用.reg
个文件。
我有同样的需求 - 从java写入注册表 - 我通过编写一个小的.NET命令行实用程序来解决它。
Sun Windows JDK附带了通用代码来写入注册表的任意部分(WindowsPreferences),但它不是公开的。 This article介绍了如何使用反射访问此类。
答案 1 :(得分:1)
如果启用了“用户帐户控制”,则无法编辑Preferences.systemRoot()。好像微软去破坏了它。有一种解决方法here,但这并不简单。
答案 2 :(得分:0)
所以我遇到了同样的问题,所以我向Oracle提出了一个问题: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043176
通过编写AbstractPreferences的自定义实现和相应的PreferencesFactory,我能够自己解决这个问题。我在Windows上所做的是将系统首选项写入注册表中定义的应用程序数据目录: HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell文件夹\ Common AppData
我使用Runtime.getRuntime().exec("reg query \""+key+ "\" /v \""+value+"\"")
来获取它(即使启用了UAC也能正常工作)。
在Windows 7上评估为“C:\ ProgramData”,在XP上评估为“C:\ Documents and Settings \ All Users \ Application Data”。我添加了一个名为“JavaPreferences”的子目录,并编写了一个使用属性文件作为后端的实现。
作为旁注,我在Linux上有类似的系统首选项问题,因为JRE的安装程序不是由root运行的,所以我没有访问“/etc/.java”。 A最终选择了另一个自定义目录并为其授予权限。