【问题标题】:java getRuntime().exec an exe that requires UACjava getRuntime().exec 一个需要UAC的exe
【发布时间】:2011-04-12 23:42:31
【问题描述】:

所以我们有一个作为 Windows 服务运行的 java 进程。它需要使用Runtime.getRuntime().exec(command) 执行命令。它执行的命令需要 UAC。这是在 windows server 2008 上,听起来你不能为单个可执行文件禁用 UAC,所以有没有其他方法可以使它工作?

【问题讨论】:

标签: java windows windows-server-2008 uac runtime.exec


【解决方案1】:

如果您的 Java 应用程序作为 Windows 服务运行,它很可能在以下系统帐户之一下运行:SYSTEM(最可能)、LOCAL SERVICE 或 NETWORK SERVICE。因此,如果该服务在 SYSTEM 帐户下运行,那么您从该服务启动的所有内容都将继承该帐户。无论如何,必须允许您的服务与 Desktop 进行交互。

总而言之,如果您的进程以提升的方式运行,那么从它启动的进程也会以提升的方式运行。


要提升,你必须使用 Windows API 的ShellExecuteShellExecuteEx 函数。如果您正在启动的 .exe 在其清单中标有 level=requireAdministrator,则 shell 将显示 UAC 对话框。如果没有标记,您可以使用runas 动词/操作来强制 UAC 确认对话框。注意:Windows XP 上的runas 将显示“以其他用户身份运行”对话框。

如果Runtime.getRuntime().exec(command) 是通过ShellExecute 实现的,那么用适当的清单标记.exe 将起作用;如果exec 使用CreateProcess,进程将以当前用户权限启动,即不提升;此外,如果 .exe 在其清单中包含 requireAdministrator,则该进程根本不会启动。

【讨论】:

  • 感谢 Alexey,我认为特别是 exe(来自 UnxUtils 的 patch.exe)没有定义正确的清单。使用 cygwin 中的 patch.exe 不会弹出 UAC(或因权限被拒绝而失败),所以我认为确实如此。
  • @vinnyjames 很高兴它有帮助。您可以通过查看 .exe 文件来检查清单。如果是 cygwin,我想如果它确实有帮助,你可以添加一个清单。
  • 是的,再次感谢。您使用什么工具查看 exe 的 UAC 清单?
  • @vinnyjames 记事本可以(但如果 .exe 很大,它会很慢);我使用远程管理器。然后只需搜索“manifest”——如果它在那里,你会看到 XML。
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2012-08-09
  • 1970-01-01
相关资源
最近更新 更多