代码之家  ›  专栏  ›  技术社区  ›  Jonas

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

  •  1
  • Jonas  · 技术社区  · 15 年前

    如何使用Java编写系统首选项 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数据库,并让计算机上的多个用户在应用程序中使用同一个数据库。

    如何解决这个问题?我可以调用UAC并从Java中执行吗?如果我在写入时作为管理员登录,如果我作为用户登录,我可以用Java应用程序读取这些值吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   mdma    15 年前

    不能从Java首选项写入任意注册表位置-所有首选项都存储在子关键字下 Software\Javasoft\Prefs . 用户首选项映射到HKEY U CURRENT U用户配置单元,系统映射到 HKEY_LOCAL_MACHINE 蜂箱。

    要写入注册表,可以使用Windows“reg”命令行工具。 This page 详细说明修改注册表的其他方法。包括使用 .reg 文件夹。

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

    Sun Windows JDK附带了通用代码,可以写入注册表的任意部分(WindowsPreferences),但它不是公共的。 This article 描述如何使用反射访问此类。

        2
  •  1
  •   Jared    14 年前

    如果启用了用户帐户控制,则无法编辑preferences.systemroot()。好像微软把它弄坏了。有个解决办法 here 但这并不简单。

        3
  •  0
  •   Jared    14 年前

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

    通过编写抽象首选项的自定义实现和相应的首选项,我可以自己解决这个问题。我在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”。a最终选择了另一个自定义目录并授予了该目录的权限。