1

を使用して、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アプリケーションで値を読み取ることはできますか?

4

3 に答える 3

2

Javaプリファレンスから任意のレジストリの場所に書き込むことはできません。すべてのプリファレンスはサブキーの下に保存されSoftware\Javasoft\Prefsます。HKEY_CURRENT_USERハイブへのユーザー設定マッピング、およびハイブへのシステムマッピングHKEY_LOCAL_MACHINE

レジストリに書き込むには、Windowsの「REG」コマンドラインツールを使用できます。このページでは、レジストリを変更する他の方法について詳しく説明します。ファイルの使用を含み.regます。

同じ必要性がありました-Javaからレジストリに書き込む-それを行うための小さな.NETコマンドラインユーティリティを書くことでそれを解決しました。

Sun Windows JDKには、レジストリの任意の部分(WindowsPreferences)に書き込むための汎用コードが付属していますが、公開されていません。この記事では、リフレクションを使用してこのクラスにアクセスする方法について説明します。

于 2010-05-29T17:31:13.553 に答える
1

ユーザーアカウント制御がオンになっている場合、Preferences.systemRoot()を編集することはできません。マイクロソフトが行ってそれを壊したようです。ここに回避策がありますが、それは簡単ではありません。

于 2011-05-09T15:30:44.140 に答える
0

同じ問題が発生したので、Oracleで問題を開きました:http: //bugs.sun.com/bugdatabase/view_bug.do? bug_id = 7043176

AbstractPreferencesと対応するPreferencesFactoryのカスタム実装を作成することで、自分で回避することができました。私が行ったことは、Windowsで、HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders \CommonAppDataによってレジストリで定義されたアプリケーションデータディレクトリにシステム環境設定を書き込むことでした。

以前Runtime.getRuntime().exec("reg query \""+key+ "\" /v \""+value+"\"")はそれを取得していました(UACがオンになっている場合でも機能します)。

これは、Windows 7では「C:\ ProgramData」、XPでは「C:\ DocumentsandSettings \ AllUsers\ApplicationData」と評価されます。「JavaPreferences」というサブディレクトリを追加し、プロパティファイルをバックエンドとして使用する実装を作成しました。

ちなみに、JREのインストーラーがrootによって実行されなかったため、「/ etc / .java」にアクセスできなかったため、Linuxのシステム環境設定で同様の問題が発生しました。最終的に別のカスタムディレクトリを選択し、そのためのアクセス許可を付与しました。

于 2011-05-25T17:23:10.900 に答える