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

时间:2010-05-29 17:16:17

标签: java windows uac preferences securityexception

如何使用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应用程序读取值?

3 个答案:

答案 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最终选择了另一个自定义目录并为其授予权限。