从Java程序写入C:\ Program Files

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

有什么办法可以实现将Java程序写入受限制文件夹的操作,从而popup安全popup框,以便用户可以访问该文件夹?


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

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

  2. 使用带有清单的exe启动程序启动Java应用程序
    就我所了解的这个解决scheme而言,exe启动器会在应用程序启动时请求扩展执行权。 这不完全是我想要的,因为我的用例,如果更新可用而不是每个应用程序启动,获得扩展权利就足够了。

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

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

  5. 将完整的应用程序安装在用户的主目录中
    由于用户可以写入主目录,因此完全没有问题。 对我来说,这看起来是最简单的select。

Solutions Collecting From Web of "从Java程序写入C:\ Program Files"

不幸的是,当你第一次启动程序的时候需要增加权限,以后你不能升级。 看起来像他们这样做的程序实际上是用幕后较高的priv来重新启动自己。

几年前,我有一个这样的问题与Java应用程序,最后我安装应用程序的用户数据文件夹,而不是程序文件,否则自动更新是一场噩梦。 你仍然可以将它添加到开始菜单,所以对于一个用户来说,它看起来和其他程序完全一样。

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