如何从Java中提升UAC权限?

14

我需要使用Preferences API的systemRoot功能,但如果UAC打开,则在Windows上由于缺少权限而失败。我试图找到弹出UAC提示并提升权限以允许systemRoot更新成功的技术细节。


可能是UAC和Java的重复问题。 - Stephen C
有点吧。然而,那个问题缺乏必要的技术细节以使其可行。我正在寻找实用信息,而不是我们都已经知道的理论。 :-) - Brian Knoblauch
1
Java bug数据库中有一个“不修复”的错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382 - Jonathas Carrijo
3个回答

6
根据此SO问题的被接受的答案,您无法更改正在运行的进程的UAC权限。
根据此SO问题的回答,启动具有提升权限的进程的可能方法包括:
  • 创建一个包装器来启动带有请求提升权限的Windows清单的JVM(具有适当的参数!)
  • 使用链接到第二个答案的应用程序以提升权限运行JVM。

我遇到的问题是,由于某种原因,我无法使JVM以提升的权限启动。 - Brian Knoblauch
@brian - 我认为你需要提供一些代码,说明你如何尝试启动提升权限。 - Kevin Day
我已经放弃了偏好设置 API,打算改为在所有用户数据目录中存储配置文件。这样就不需要进行 UAC 提升了。 - Brian Knoblauch

2
除了使用 JNI 调用 ShellExecute 并指定 verb = runas,还可以使用清单来实现这一点 - 但使用清单指定更加可靠。将清单嵌入到 exe 中可能有些棘手,在早期版本的 Visual C++ 中处理清单时存在许多问题,但现在大部分问题都已解决。
话虽如此,我鼓励您认真考虑为什么需要访问系统根目录 - 是为了存储所有用户的设置吗?如果是这样,您可能需要考虑使用一个单独的应用程序来管理这些设置(具有自己的清单)。您不能只弹出 UAC 提升对话框 - 您实际上必须启动一个新进程(如果您查看以这种方式工作的应用程序的任务管理器,您会看到第二个应用程序实例实际上被启动了 - 在任务管理器中查看 UAC 虚拟化列以查看差异)。
另一个可能性是调整在非提升进程中绝对必须配置的注册表区域的安全设置 - 但这违反了 UAC 的设计,并且几乎总是会引起更多麻烦。最好喝 M$ 的 Kool-Aid 并为 UAC 正确设计您的应用程序。(相信我,我在这方面感受到了您的痛苦 - 已经经历了很多次)。
当我自己经历这种疼痛时,我发现以下的MSDN文章对于理解UAC的Microsoft设计意图非常有帮助:

http://msdn.microsoft.com/en-us/library/aa511445.aspx

希望这有所帮助...

很不幸,似乎没有其他办法。我有一些数据,任何用户都需要能够为我们的应用程序更新所有用户的数据。我们以前在Program Files中有依赖文件,但在NWO中无法使用。Preferences API似乎是解决方法,但我在Windows平台上遇到了特定的问题(我们的应用程序也在OS X和*nix上使用)。一个单独的更新程序应该没问题。我一直在尝试启动我的应用程序的另一个副本,但使用命令行选项来选择替代代码路径进行更新(这样打包会比捆绑另一个应用程序更简单)。 - Brian Knoblauch
是的 - 提升权限来设置这些特定的设置是正确的做法(有时在安装过程中调整文件夹权限也是适当的,但有时不是)。 - Kevin Day

2
您可以使用run-as-root库:https://github.com/dyorgio/run-as-root
// Specify JVM options (optional)
RootExecutor rootExecutor = new RootExecutor("-Xmx64m");

// Execute privileged action
rootExecutor.run(() -> System.out.println("Call your admin code here."));

附言:我是作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接