Можете ли вы определить, позволяет ли Vista UAC выполнять запись в каталог без повышения прав в java? - PullRequest
2 голосов
/ 27 ноября 2009

Вот сценарий. У меня есть приложение, которое записывает файл конфигурации в его каталог (user.dir). Когда пользователь не может записать в этот каталог из-за проблем с UAC, я бы хотел изменить это значение на user.home/.appname/. Проблема в том, что Windows действительно лжет моему приложению и пишет в user.dir, который находится в каталоге Program Files, но, хотя он разрешает запись и чтение (даже после перезапуска), он не сохраняет его там, он сохраняет его в скрытый каталог (домашний каталог / AppData / Local / VirtualStore / Program Files / appname), затрудняющий / невозможный для пользователя найти, хотят ли они редактировать файл.

Однако я не хочу просто изменять свое приложение для записи на user.home и покончить с этим, потому что некоторые пользователи запускают приложение с USB-накопителя, и в этот момент я хочу использовать user.dir, если оно доступен, потому что в этом сценарии (на гостевом компьютере) было бы бесполезно оставлять вещи вокруг домашнего каталога пользователя.

Итак, после этого довольно длинного запутанного фона, есть ли способ из java узнать, действительно ли локальный каталог действительно доступен для прямой записи из Java или же Vista собирается вместо этого виртуализировать запись каталога в другое место?

Ответы [ 3 ]

1 голос
/ 06 декабря 2009

Эта проблема возникает, если исполняемый файл Java не помечен как совместимый с Vista (с использованием манифеста). Текущая версия от Sun помечена как совместимая. Поэтому самое простое решение - использовать последний выпуск. Это означает, что теперь ни файлы, ни записи реестра не виртуализированы.


Редактировать от автора ОП:

Обновление Java 6 10 (ошибка 6722527) добавило манифест в соответствующие файлы. Ошибка 6737858 устраняет другие проблемы и фиксируется как исправленная в выпуске 12, хотя ее нет в примечаниях к выпуску. Для JDK 1.5 установщик был исправлен в Обновление 11 , однако Sun не будет добавлять манифесты в exe. Вы можете добавить его самостоятельно, поместив файл манифеста в тот же каталог, что и исполняемый файл, если он достаточно важен.

0 голосов
/ 04 декабря 2009
  1. Подготовьте собственный EXE, который загружает JVM в процессе (java.exe делает это, но вам понадобится ваш собственный).

  2. Добавить файл манифеста (или в данных RC), в котором UAC указывается как вызывающий.

  3. Попробуйте написать в папку, чтобы проверить, работает ли она.

Или решите, что это слишком много работы, и используйте файл конфигурации.

0 голосов
/ 27 ноября 2009

После записи вашего файла, можете ли вы просто убедиться, что файл внезапно появился в виртуализированном каталоге? Я бы сделал небольшой «сенсорный» файл при запуске приложения, чтобы установить глобальную логическую переменную userUserHome.

...