Как я могу написать Системные настройки с Java? Могу ли я вызвать UAC? - PullRequest
1 голос
/ 29 мая 2010

Как я могу написать системные настройки с помощью 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 ]

2 голосов
/ 29 мая 2010

Вы не можете писать в любое произвольное место в реестре из настроек Java - все настройки хранятся в подразделе Software\Javasoft\Prefs. С привязкой пользовательских настроек к кусту HKEY_CURRENT_USER и системным сопоставлением с кустом HKEY_LOCAL_MACHINE.

Для записи в реестр вы можете использовать инструмент командной строки Windows "REG". На этой странице подробно описаны другие способы изменения реестра. включая использование .reg файлов.

У меня была такая же потребность - записать в реестр из Java - я решил это, написав для этого небольшую утилиту командной строки .NET.

Sun Windows JDK поставляется с общим кодом для записи в произвольные части реестра (WindowsPreferences), но он не является общедоступным. В этой статье описывается, как получить доступ к этому классу с помощью отражения.

1 голос
/ 09 мая 2011

Вы не можете редактировать Preferences.systemRoot (), если включен контроль учетных записей. Похоже, Microsoft пошла и сломала это. Здесь есть обходной путь , но он не прост.

0 голосов
/ 25 мая 2011

Итак, у меня была такая же проблема, поэтому я открыл проблему с Oracle: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7043176

Я смог обойти это самостоятельно, написав собственную реализацию AbstractPreferences и соответствующую PreferencesFactory. То, что я сделал, было в Windows, чтобы системные настройки записывали в каталог данных приложения, определенный в реестре: HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки оболочки \ Общие данные приложения

Я использовал Runtime.getRuntime().exec("reg query \""+key+ "\" /v \""+value+"\""), чтобы получить это (работает даже с включенным UAC).

Это означает "C: \ ProgramData" в Windows 7 и "C: \ Documents and Settings \ All Users \ Application Data" в XP. Я добавил подкаталог с именем «JavaPreferences» и написал реализацию, в которой в качестве бэкэнда используется файл свойств.

Как примечание, у меня была похожая проблема с системными настройками в Linux, потому что установщик для JRE не запускался пользователем root, поэтому у меня не было доступа к /etc/.java. В итоге мы выбрали другой пользовательский каталог и предоставили для этого разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...