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

我需要使用Preferences API的systemRootfunction,但是如果UAC处于打开状态,则由于Windows上的权限不足而失败。 我试图findpopupUAC提示的技术细节,并提升我的权限,以允许systemRoot更新成功。

根据对此SO问题的接受答案,您不能更改正在运行的进程的UAC权限。

根据这个SO问题的答案,使用提升权限启动进程的可能方法是:

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

除了使用JNI以verb = runas调用ShellExecute的清单之外,还会这样做 – 但是使用清单指定事物是更强健的方式。 获取embedded到exe中的清单可能有点棘手,而且早期版本的Visual C ++中的清单处理存在很多问题,但其中大部分都是现在制定的。

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

另一种可能性是调整registry区域中的安全设置,您必须从非升级过程中configuration安全设置 – 但这与UAC的devise背道而驰,并且几乎总是会造成比其价值更大的麻烦。 喝M $ kool-aid可能会更好,并为UAC正确devise你的应用程序。 (相信我,我感觉到你的痛苦 – 经历过很多次)。

当我自己遇到这种痛苦时,我发现下面的MSDN文章对于理解UAC的Microsoftdevise意图很有帮助:

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

希望这可以帮助…