2011-01-11 51 views
11

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

+0

[UAC和Java]的可能重复(http://stackoverflow.com/questions/1076794/uac-and-java) – 2011-01-11 21:03:40

+0

排序然而,这个特定的问题严重缺乏使其工作所需的技术细节。我正在寻找*实用信息,而不是我们都知道的理论。 :-) – 2011-01-12 13:18:52

+1

在java bug数据库中有一个“无法修复”的bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382 – 2014-11-03 16:50:10

回答

6

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

根据答案this SO question,推出以提升的权限的过程可能的方式是:

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

除了清单使用JNI调用带有verb = runas的ShellExecute也会这样做 - 但使用清单指定内容是一种更健壮的方式。获取嵌入到exe中的清单可能有点棘手,并且早期版本的Visual C++中的清单处理存在很多问题,但其中大多数都是现在制定出来的。

也就是说,我鼓励你认真思考为什么你需要访问系统根目录 - 是否存储所有用户的设置?如果是这样,你可能想考虑有一个单独的应用程序来管理这些设置(使用它自己的清单)。你不能只是弹出一个UAC提升对话框 - 你实际上必须启动一个新的进程(如果你看到任务管理器的应用程序似乎以这种方式工作,你会看到应用程序的第二个实例实际上启动 - 查看任务管理器中的UAC虚拟化列以查看差异)。

另一种可能性是,你绝对必须从非提升过程中配置注册表的区域来调整安全设置 - 但这违背了UAC的设计,它会几乎总是造成更多的麻烦比它的价值。可能更好地喝M $ kool-aid并为UAC正确设计你的应用程序。 (相信我,我感到你的痛苦 - 经历过很多次)。

当我正经历着这种痛苦我自己,我发现下面的MSDN文章非常有助于了解微软的设计意图与UAC:

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

希望这有助于...

2

你可以使用运行作为根库: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.")); 

PS:我是作者。