Как я могу написать Системные настройки с помощью Java? Могу ли я вызвать UAC?

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


person Jonas    schedule 29.05.2010    source источник


Ответы (3)


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

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

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

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

person mdma    schedule 29.05.2010
comment
Так что я не могу писать на Software\Javasoft\Prefs с Preferences.systemRoot(), это только для Preferences.userRoot()? Мне не важно, где я это пишу, я просто хочу, чтобы это было для каждого пользователя, или от Preferences.systemRoot() толку нет? - person Jonas; 29.05.2010
comment
все корни пишите под Syftware\JavaSoft\Prefs. Пользователь root записывает в пользовательскую часть реестра, системный root записывает в систему (т. е. требуются права администратора). В любом случае вы не можете писать выше Software\javasoft\prefs. Для этого см. вторую часть моего ответа. - person mdma; 29.05.2010
comment
А, спасибо. Итак, вопрос: как я могу написать, что системный корень записывает в Software\Javasoft\Prefs (требуются права администратора), когда я не вошел в систему как администратор? можно ли использовать UAC или аналогичную технику (например, технику Java)? Или, если я пишу в системный корень как администратор, могу ли я читать значения как пользователь? - person Jonas; 29.05.2010
comment
Вы всегда можете читать системные корни как пользователь, поэтому войдите в систему как администратор и напишите, и ваши пользователи смогут читать. Чтобы писать от имени администратора, вам, конечно, нужны права администратора. Windows может предоставлять установщикам MSI повышенные права администратора, поэтому вы можете установить свое приложение как MSI, который может записывать в системные настройки (куст HKLM). Раньше я использовал AdvancedInstaller, доступна бесплатная версия. - person mdma; 29.05.2010

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

person Jared    schedule 09.05.2011
comment
Похоже, Microsoft пошла и сломала его. UAC — одна из немногих инициатив Microsoft в области безопасности, которая действительно работает. Не выходите из дома без него. - person Andrew Thompson; 09.05.2011
comment
Это правда, но усиление безопасности может привести к поломке. - person Jared; 25.05.2011

У меня была такая же проблема, поэтому я открыл проблему с 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).

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

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

person Jared    schedule 25.05.2011