java getRuntime()。exec需要UAC的exe

时间:2011-04-12 23:42:32

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

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

1 个答案:

答案 0 :(得分:5)

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

总而言之,如果您的流程以提升方式运行,那么从它开始的流程也将升级。


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

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