尝试从C:\ ProgramData访问文件时获取“拒绝访问”

时间:2011-07-12 09:52:44

标签: java windows windows-7 uac

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

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

我发现help page但这不适合我。我的应用程序是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 个答案:

答案 0 :(得分:1)

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

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

您可以阅读有关这些Windows programming requirements for user data storage herehere is how some people have done this in Java的更多信息。希望有助于你解决问题!

第二个想法,也许使用像PROCMON.EXE这样的工具将有助于缩小拒绝的细节 - 因为它会告诉你编程是否打开文件/目录进行阅读,全部写作-permissions,尝试创建已存在的文件等。

答案 1 :(得分:0)

  

它抛出访问被拒绝

真的吗?

没有这样的例外。

什么是实际异常,实际消息,以及实际代码行是什么?

答案 2 :(得分:0)

最快的解决方案是让您使用xcacls.exe utilityicacls.exe utility。使用它们,您可以在C:\ ProgramData中为“Everyone”或其他人提供读/写/ etc配置文件的权限。

注意:确保仅更改您需要从程序访问的文件的权限。 ProgramData是一个系统文件夹,通常不应该访问。

更新:此外,您需要将清单特别嵌入到可执行文件中作为RT_MANIFEST资源。这可以通过Manifest Tool (mt.exe)轻松完成。有关这方面的更多信息,请参阅此answer