2009-11-26 4 views
2

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

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

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

ответ

1

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


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

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

+0

Спасибо, Марк, знаете ли вы о каком-либо месте, которое документирует конкретные выпуски, отмеченные совместимостью Vista? В частности, я ищу, если какой-либо из 1.5 выпусков (может быть, последний с 3 ноября), или это всего лишь 1,6? – Yishai

+0

Нет. Я не знаю такой документации. Есть даже связанные ошибки, которые не были закрыты. –

+0

Насколько я могу судить, манифест был добавлен в 1.6 update 10. –

0

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

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

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

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

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

+0

Действительно, слишком много работы для этого случая, но разве это не вызовет запрос на возвышение для пользователя? – Yishai

+0

@Yishai: Нет, манифест для RunAsInvoker гарантирует, что вы этого не сделаете. – Joshua

Смежные вопросы