【问题标题】:How do I elevate my UAC permissions from Java?如何从 Java 提升我的 UAC 权限?
【发布时间】:2011-06-07 10:45:35
【问题描述】:

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

【问题讨论】:

标签: java windows uac


【解决方案1】:

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

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

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

【讨论】:

  • 我遇到的问题是,由于某种原因,我无法让 JVM 以提升的权限启动。
  • @brian - 我认为您需要提供一些代码来说明您如何尝试启动提升
  • 我已经放弃了 Preferences API,而是只做存储在所有用户数据目录中的配置文件。不需要为此进行 UAC 升级。
【解决方案2】:

除了清单之外,使用 JNI 调用带有 verb = runas 的 ShellExecute 也将执行此操作 - 但使用清单指定事物是一种更稳健的方式。将清单嵌入到 exe 中可能有点棘手,并且在早期版本的 Visual C++ 中清单处理存在很多问题,但现在大部分都已解决。

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

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

当我自己经历这种痛苦时,我发现以下 MSDN 文章对于理解 Microsoft 使用 UAC 的设计意图非常有帮助:

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

希望这会有所帮助...

【讨论】:

  • 不幸的是,似乎没有任何解决办法。我有任何用户需要能够为我们的应用程序的所有用户更新的数据。我们曾经在 Program Files 中有依赖文件,但这在 NWO 中不起作用。 Preferences API 似乎是要走的路,但我遇到了 Windows 平台特定的问题(我们的应用程序也用于 OS X 和 *nix)。单独的更新程序应用程序就可以了。我一直在尝试启动我的应用程序的另一个副本,但使用命令行选项来选择替代代码路径来进行更新(使打包比捆绑另一个应用程序更简单)。
  • 是 - 提升以设置这些特定设置是正确的做法(您也可以在安装过程中调整文件夹权限 - 有时这是合适的,有时不是)。
【解决方案3】:

您可以使用以 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."));

P.S.:我是作者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2022-01-14
    • 2011-05-21
    • 2011-01-06
    • 2011-10-16
    相关资源
    最近更新 更多