【问题标题】:Can you determine if Vista UAC allows writing to a directory without elevation in java?你能确定Vista UAC是否允许在java中写入一个没有提升的目录吗?
【发布时间】:2009-11-26 22:32:53
【问题描述】:

这里是场景。我有一个应用程序,它在其目录 (user.dir) 中写入配置文件。当用户由于 UAC 问题而无法写入该目录时,我想将其更改为写入user.home/.appname/。问题是 Windows 真的对我的应用程序撒谎并写入 Program Files 目录中的user.dir,但是虽然它允许写入和读取(即使在重新启动后)它并没有将它存储在那里,而是将它存储在一个隐藏目录(主目录/AppData/Local/VirtualStore/Program Files/appname),使用户很难/不可能找到他们是否要编辑文件。

但是,我不想只是将我的应用程序更改为写入 user.home 并完成它,因为有些用户从 USB 驱动器运行应用程序,此时我想使用 user.dir 如果它是可用的,因为在这种情况下(在来宾计算机上)将内容留在用户主目录周围没有帮助。

那么在这个相当冗长的背景之后,有没有办法从 java 知道本地目录是否真的真的可以直接从 Java 写入,或者 vista 是否将虚拟化目录写入到另一个位置?

【问题讨论】:

    标签: java windows-vista uac


    【解决方案1】:

    如果 Java 可执行文件未标记为 Vista 兼容(使用清单),则会出现此问题。 Sun 的当前版本被标记为兼容。所以最简单的解决方案是使用最新版本。这意味着现在文件和注册表项都没有被虚拟化。


    由 OP 的作者编辑:

    Java 6 Update 10(错误 6722527)将清单添加到相关文件中。错误6737858 解决了更多问题,并在版本 12 中记录为已修复,尽管它不在版本说明中。对于 JDK 1.5,安装程序已修复为 Update 11,但是 Sun 不会将清单添加到 exe 中。如果足够重要,您可以通过将清单文件与 exe 放在同一目录中自己添加一个。

    【讨论】:

    • 谢谢 Mark,你知道有什么地方记录了标记为 Vista 兼容的特定版本吗?具体来说,我正在查看是否有任何 1.5 版本(可能是 11 月 3 日的最后一个版本),还是只有 1.6?
    • 不,我不知道任何此类文档。甚至还有一些相关的 bug 没有被关闭。
    • 据我所知,清单是在 1.6 更新 10 中添加的。
    【解决方案2】:

    写完你的文件后,你能检查一下文件突然出现在虚拟化目录中吗?我会在应用程序开始时做一个小的“触摸”文件来设置一个全局布尔变量 userUserHome。

    【讨论】:

      【解决方案3】:
      1. 准备一个在进程中加载​​ JVM 的本机 EXE(java.exe 会执行此操作,但您需要自己的)。

      2. 添加将 UAC 指定为调用者的清单文件(或在 RC 数据中)。

      3. 尝试写入文件夹,看看是否有效。

      或者认为这是太多的工作并使用配置文件。

      【讨论】:

      • 在这种情况下确实需要做太多工作,但这不会触发对用户的提升请求吗?
      • @Yishai:不,RunAsInvoker 的清单确保你不这样做。
      猜你喜欢
      • 2011-04-15
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多