【问题标题】:Runtime.exec run as Non AdminRuntime.exec 以非管理员身份运行
【发布时间】:2019-09-23 22:31:44
【问题描述】:

我有一个可以自我更新的 Java 应用程序。

Java 应用程序最初以非管理员身份运行,如果您想更新,它将执行我创建的 .lnk 快捷方式,该快捷方式指向另一个 .jar 文件,专门用于更新(但具有管理员访问权限) .

指向 .jar 更新程序的 .lnk 快捷方式通过在此处使用此答案请求管理员权限 >> https://stackoverflow.com/a/30028948/1862452

更新主 jar 后,我希望 .jar 更新程序再次运行主 .jar,但我希望它是非管理员。我该怎么做呢?它当前以管理员身份运行,因为更新程序 jar 当前以管理员身份运行

【问题讨论】:

  • 您需要使用低级别的 WinAPI。基本上,您必须致电CreateProcessWithTokenW
  • 是的,我试图避免使用 JNI 的东西。我正在阅读具有最低权限的 runas 命令,但我似乎无法运行我的命令: runas /trustlevel:0x20000 "'C:\\javaw.exe' -jar 'C:\ \main.jar'"我认为空格有问题,因为它给了我2:系统找不到指定的文件。

标签: java windows jar uac


【解决方案1】:

我以不同的方式解决了我的问题。

当用户想要更新主 .jar 时,它会执行两次Runtime.exec()。第一个调用 cmd 并为请求管理员访问权限的更新程序执行 .lnk 快捷方式。第二个是更新程序 .jar 窗口的观察者。

watcher .jar 文件每隔一段时间(假设每 1 秒)执行一个 windows 命令tasklist /fi "Windowtitle eq <JAR UPDATER WINDOW NAME>"并计算输出的行数。它有2个状态

1) 检测更新程序正在运行(输出行数 > 1)
2) Detect Updater is dead (line count of output == 1)

2个状态后,表示main.jar已经更新,updater死掉了。然后它调用 main.jar。

由于这个 watcher .jar 是以非管理员身份调用的,它也会以非管理员身份调用 main.jar。

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2012-11-22
    • 2016-09-20
    • 2010-11-26
    • 2012-05-28
    • 2011-03-24
    • 2021-08-10
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多