Получение «Отказано в доступе» при попытке доступа к файлу из C: \ ProgramData - PullRequest
2 голосов
/ 12 июля 2011

Наши клиенты часто сообщают о проблеме, что они получают исключение «Отказано в доступе», когда они использовали для запуска приложения, которое было установлено с загруженным файлом установки. Наш установщик устанавливает исполняемый файл в «Program Files» и создает файлы конфигурации в C: \ ProgramData. После завершения установки наше приложение автоматически запускается в первый раз. Каждый раз, когда пользователь собирается запустить его в следующий раз, он выдает Доступ запрещен , поскольку программа не может получить доступ к файлам конфигурации в C: \ ProgramData.

Да .. "Запуск от имени администратора" - это решение, но мы не можем просить всех наших платных пользователей сделать это. Я искал вариант в может установить привилегии каким-либо альтернативным способом, а затем вручную запустить исполняемый файл как «Запуск от имени администратора».

Я обнаружил, что страница справки , но это не работает для меня. Мое приложение является настольным приложением java, поэтому я создал файл .exe.manifest и поместил этот файл манифеста в исполняемый файл, в котором находятся изображения и файлы свойств других продуктов.

Манифест не работает для меня, и я все еще получаю проблему «Отказано в доступе».

Это содержимое файла манифеста -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="<product_name>"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="true"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

Как я могу прикрепить манифест приложения к исполняемому файлу, поскольку я скопировал только тот манифест, где находятся изображения и файлы свойств другого продукта?

Нужно ли что-либо обновлять в файле манифеста, поскольку я скопировал содержимое как есть, кроме?

Исключение -

java.io.FileNotFoundException: C:\ProgramData\.<poduct_name>\config\<Product_Name>.xml (Access is denied) stacktrace javax.xml.transform.TransformerException: java.io.FileNotFoundException: C:\ProgramData\.<Product_Name>\config\<Product_Name>.xml (Access is denied) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputHandler(Unknown Source) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source) at com.<Product_Name>.main.dr.a(Unknown Source) at com.<Product_Name>.main.dr.a(Unknown Source) at com.<Product_Name>.main.dr.a(Unknown Source) at com.<Product_Name>.main.h.k(Unknown Source) at com.<Product_Name>.main.ay.run(Unknown Source) Caused by: java.io.FileNotFoundException: C:\ProgramData\.<Product_Name>\config\<Product_Name>.xml (Access is denied) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream. (Unknown Source) at java.io.FileOutputStream. (Unknown Source) ... 7 more --------- java.io.FileNotFoundException: C:\ProgramData\.<Product_Name>\config\<Product_Name>.xml (Access is denied) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream. (Unknown Source) at java.io.FileOutputStream. (Unknown Source) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputHandler(Unknown Source) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source) at com.<Product_Name>.main.dr.a(Unknown Source) at com.<Product_Name>.main.dr.a(Unknown Source) at com.<Product_Name>.main.dr.a(Unknown Source) at com.<Product_Name>.main.h.k(Unknown Source) at com.<Product_Name>.main.ay.run(Unknown Source) and the cause isjava.io.FileNotFoundException: C:\ProgramData\.<Product_Name>\config\<Product_Name>.xml (Access is denied)

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Проблема в том, что файл пользовательских настроек хранится не в том месте.

Только исполняемые двоичные файлы и связанные ресурсы принадлежат каталогу ProgramData («C: \ Program Files ...»), и эти данные должны изменяться только тогда, когда пользователь с правами администратора устанавливает или обновляет установку программы. Любая конфигурация или данные, которые пользователь должен изменить, должны храниться в местах, где у пользователя есть права на редактирование, таких как его домашняя папка, «Мои документы», его раздел реестра HKEY_CURRENT_USER или, что еще лучше, его каталог AppData.

Вы можете узнать больше об этих требованиях программирования Windows для хранения пользовательских данных здесь , а - вот как некоторые люди сделали это в Java . Надеюсь, это поможет вам исправить ситуацию!

Если подумать, возможно, использование такого инструмента, как PROCMON.EXE , поможет сузить специфику отказа - потому что он покажет, открывает ли программа файл / каталог для чтения и записи. -with-all-permissions, пытается создать файл, который уже существует и т. д.

0 голосов
/ 16 июля 2011

Самое быстрое решение - использовать утилиту xcacls.exe или утилиту icacls.exe . Используя их, вы можете дать «Все» или кому угодно разрешение на чтение / запись / etc файлы конфигурации в C: \ ProgramData.

Примечание: Обязательно меняйте права доступа только к тем файлам, к которым вам нужен доступ из вашей программы. ProgramData - это системная папка, которая не должна быть общедоступной.

Обновление: Кроме того, вам необходимо встроить манифест в исполняемый файл специально как ресурс RT_MANIFEST. Это легко сделать с помощью Manifest Tool (mt.exe) . Более подробную информацию об этом можно найти в этом ответе .

0 голосов
/ 12 июля 2011

выдает Доступ запрещен

Это правда?

Нет такого исключения.

Что такое исключение фактическое и сообщение фактическое , и в какую строку кода фактическое оно брошено?

...