我需要使用Preferences API的systemRoot功能,但如果启用了UAC,则由于Windows上缺少权限而失败。我正在尝试查找弹出UAC提示的技术细节,并提升我的权限以允许systemRoot更新成功。
答案 0 :(得分:6)
根据this SO question的已接受答案,您无法更改正在运行的进程的UAC权限。
根据this SO question的答案,启动具有提升权限的流程的可能方法是:
答案 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。:我是作者。