如何从Java提升我的UAC权限?

时间:2011-01-11 20:58:15

标签: java windows uac

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

3 个答案:

答案 0 :(得分:6)

根据this SO question的已接受答案,您无法更改正在运行的进程的UAC权限。

根据this SO question的答案,启动具有提升权限的流程的可能方法是:

  • 创建一个包装器来启动JVM(带有适当的参数!)和一个请求提升权限的Windows清单,或者
  • 使用链接到第二个答案的应用程序以提升的权限运行JVM。

答案 1 :(得分: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

希望这会有所帮助......

答案 2 :(得分:2)

您可以使用run-as-root library:ncurses

// Specify JVM options (optional)
RootExecutor rootExecutor = new RootExecutor("-Xmx64m");

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

P.S。:我是作者。