【问题标题】:Write to C:\Program Files from Java program从 Java 程序写入 C:\Program Files
【发布时间】:2014-01-29 21:39:26
【问题描述】:

我编写了一个包含自我更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。虽然如果安装了应用程序,这可以完美地工作,例如在用户主目录中,如果它安装在 C:\Program Files 文件夹中,它在 Windows 机器上会失败。这是因为 JVM 是在对程序目录没有写权限的用户帐户下执行的。 如果是本机程序,例如安装程序,尝试写入程序文件夹,通常会出现一个弹出窗口,要求用户允许写入操作。 Java 应用程序不会发生这种情况。为什么?

有没有办法实现Java程序对受限文件夹的写入操作会弹出安全弹出窗口,以便用户可以允许访问该文件夹?


感谢您的回复。根据答案,我看到以下选项:

  1. Java Web Start
    对我来说,这不是最终用户的选择。我认为没有人可以期望普通的最终用户知道 Java Web Start 是什么,它有什么用处以及它是如何使用的,例如我怀疑普通 Windows 用户知道如何卸载 Java Web Start 应用程序。

  2. 使用带有清单的 exe 启动器来启动 Java 应用程序
    据我了解此解决方案,exe-launcher 将在应用程序启动时请求扩展执行。这不是我想要的,因为对于我的用例,如果更新可用而不是在每次应用程序启动时获得扩展权限就足够了。

  3. 通过调用本机可执行文件执行更新操作
    可以调用本机可执行文件来让它执行更新操作。这样,应用程序将仅在更新可用时请求扩展权限。这听起来不错,但包含一些适用于 Windows 的本机编码,并且不适用于其他平台。

  4. 在程序文件夹中安装启动器,在用户主页中安装应用程序
    可以在程序文件夹中放置一个启动器,该启动器调用安装在用户主目录中的应用程序。这样就可以更新用户主文件夹中的应用程序。 我使用 InnoSetup 在 Windows 上安装我的应用程序,据我所知,使用此安装程序很难实现拆分安装,可能也很难使用其他安装程序。

  5. 在用户的主目录中安装完整的应用程序
    因为用户对他的主目录有写访问权,所以完全没有问题。对我来说,这看起来是最好的选择,因为它很简单。

【问题讨论】:

  • 在另一个问题中,您询问的是 JWS。为什么不安装这个应用程序。使用 JWS?它提供自动更新..
  • 我是 UAC,我会立即阻止您的应用程序并永远阻止它的执行。谁保证你不会在看似无辜的 java 东西中引入恶意可执行文件?
  • 在 Program Files 中放置一个 starter/updater,并让真正的应用程序下载到用户的子目录 .MyApp。并且:JWS 比看起来更简单。
  • @user2662314 互联网上有很多使用 JWS 的应用程序。 ArgoUML 立即浮现在脑海中。但是,您知道自己的要求是什么,因此最终是您的选择。对于您的问题,我认为您所指的授权弹出窗口是特定于操作系统的。 Java 是跨平台的,它可能只是不支持它。您可能需要考虑进行 JNI 调用,甚至开发一些其他方法来更新,可能通过辅助程序或可以使用本机 Windows 的东西。

标签: java windows access-rights


【解决方案1】:

如果您使用 inno setup 编译器来生成启动器,那么您可以更改您的应用目录权限。

例如,如果您需要完全控制并想要更新 AppName/data 文件夹下的文件

[Dirs]
Name: "{app}"; 
Name: "{app}\data"; Permissions: everyone-full

[Files]
Source: data\*; DestDir: {app}\data\; Flags: ignoreversion recursesubdirs createallsubdirs; Permissions: everyone-full

【讨论】:

  • 我很高兴在这里看到这个答案(因为我使用的是 inno 设置)。然而,这个答案可以扩展为更一般的用途:在安装过程中编辑程序文件中应用程序文件夹的权限。
【解决方案2】:

不幸的是,当您第一次启动程序时需要请求增加的权限,您以后无法升级到他们。看起来像它们的程序实际上是在幕后以更高的权限重新启动自己。

几年前我在使用 Java 应用程序时遇到过这样的问题,最后我将应用程序安装到用户数据文件夹而不是程序文件中,否则自动更新是一场噩梦。您仍然可以将它添加到开始菜单中,这样对于用户来说它看起来就像任何其他程序一样。

【讨论】:

  • 我不明白的是,像安装程序这样的本地程序也首先以用户权限启动,然后当程序尝试访问程序文件夹时,如果用户确认它会获得管理员权限安全弹出窗口。因此,当程序启动时,它 >not
  • 我已经回答过了。它没有 - 安装程序会自行重新启动,并在重新启动时请求增加权限。
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多