从Java程序写入C:\ Program Files

时间:2014-01-10 19:07:19

标签: java windows access-rights

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

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


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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

如果您使用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

答案 1 :(得分:2)

不幸的是,首次启动程序时需要增加权限,以后无法向他们推广。看起来他们这样做的程序实际上是在幕后使用更高级别的权限重新启动。

几年前我用Java应用程序遇到了这样的问题,最后我将应用程序安装到用户数据文件夹而不是程序文件,否则自动更新是一场噩梦。您仍然可以将其添加到开始菜单,以便用户看起来与任何其他程序完全一样。