java - 尝试从 C :\ProgramData 访问文件时获取 'Access Denied'

标签 java windows windows-7 uac

我们的客户经常报告他们在过去运行已使用下载的安装文件安装的应用程序时出现“访问被拒绝”异常的问题。我们的安装程序在“Program Files”上安装可执行文件,并在 C:\ProgramData 中创建配置文件。安装完成后,我们的应用程序将首次自动运行。每当用户下次运行它时,它都会抛出访问被拒绝,因为程序无法访问 C:\ProgramData 中的配置文件。

是的..“以管理员身份运行”是解决方案,但我们不能要求所有付费用户都这样做。我搜索了可以通过某种替代方式设置权限的选项,然后以“以管理员身份运行”手动运行可执行文件。

我发现 help page但这对我不起作用。我的应用程序是 Java 桌面应用程序,所以我创建了 .exe.manifest 文件并将该 list 文件放入图像和其他产品属性文件所在的可执行文件中。

Manifest 对我不起作用,我仍然遇到“拒绝访问”问题。

这是 list 文件的内容 -

<?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>

我如何才能将应用程序 list 附加到可执行文件,因为我只复制了图像和其他产品属性文件所在的 list ?

list 文件中是否有任何内容需要更新,因为我已经按原样复制了内容,但除外?

异常——

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)

最佳答案

问题是因为用户设置文件存储在错误的地方。

只有可执行二进制文件和相关资源属于 ProgramData 目录(“C:\Program Files...”),并且只有当具有管理员权限的用户安装或更新程序安装时,此数据才应更改。用户需要更改的任何配置或数据都必须保存在用户有权编辑的位置,例如他们的主文件夹、“我的文档”、他们的 HKEY_CURRENT_USER 注册表项,或者更好的是,他们的 AppData 目录。

您可以阅读更多关于这些的信息 Windows programming requirements for user data storage here , 和 here is how some people have done this in Java .希望这能帮助您解决问题!

再三考虑,也许使用像 PROCMON.EXE 这样的工具将有助于缩小拒绝的具体范围——因为它会告诉你程序是否正在打开文件/目录进行读取、以所有权限写入、尝试创建一个已经存在的文件等。

关于java - 尝试从 C :\ProgramData 访问文件时获取 'Access Denied',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6662329/

相关文章:

windows-7 - Windbg 故障转储分析

java - 如何在单击 "exit"MenuItem() 时关闭窗口?

java - Android 中的上下文菜单

java - 打开文件并将其内容设置为 JavaFX NullPointer 中的 TextArea

c# - 检测屏幕保护程序是否处于事件状态和/或用户是否已在 Windows 中锁定屏幕

python - 使 Tkinter 窗口显示在任务栏中

java - 更改字节数组中的位

windows - 使用CATALINA_OPTS启动Tomcat Catalina实现JMX监控(Windows Server)

android - 在 android for windows 上运行 kivy

python - 安装 Python 的多个主要版本和位版本