如何用Java编写系统首选项? 我可以调用UAC吗?

如何使用Preferences.systemRoot()来编写系统首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) 

我想这样做,因为我想安装一个embedded式的JavaDB数据库,并让计算机上的多个用户与应用程序一起使用同一个数据库。

如何解决这个问题? 我可以调用UAC并从Java以pipe理员身份执行此操作吗? 如果我以pipe理员身份login时,如果以用户身份login,可以使用我的Java应用程序读取值吗?

Solutions Collecting From Web of "如何用Java编写系统首选项? 我可以调用UAC吗?"

您不能从Java首选项写入任何任意注册表位置 – 所有首选项都存储在子项Software\Javasoft\Prefs 。 将用户首选项映射到HKEY_CURRENT_USER配置单元,并将系统映射到HKEY_LOCAL_MACHINE配置单元。

要写入注册表,您可以使用Windows“REG”命令行工具。 本页详细介绍了修改注册表的其他方法。 包括使用.reg文件。

我有同样的需要 – 从Java写入注册表 – 我通过编写一个小的.NET命令行实用程序来解决它。

Sun Windows JDK的确提供了通用代码来写入注册表的任意部分(WindowsPreferences),但它并不公开。 本文介绍如何使用反射访问此类。

如果用户帐户控制处于打开状态,则无法编辑Preferences.systemRoot()。 看起来像微软去打破它。 这里有一个解决方法,但并不简单。

所以我有同样的问题,所以我用Oracle打开了一个问题: http : //bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043176

通过编写AbstractPreferences的自定义实现和相应的PreferencesFactory,我可以自己解决这个问题。 我所做的是在Windows系统首选项写入在注册表中定义的应用程序数据目录:HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders \ 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”。 结束了挑选另一个自定义目录和授予权限。