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

StackOverflow https://stackoverflow.com/questions/1805960

  •  05-07-2019
  •  | 
  •  

Вопрос

Вот сценарий. У меня есть приложение, которое записывает файл конфигурации в свой каталог ( 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 собирается вместо этого виртуализировать запись каталога в другое место?

Это было полезно?

Решение

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

<Ч>

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

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

Другие советы

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top