所以我们有一个作为Windows服务运行的java进程。它需要使用Runtime.getRuntime().exec(command)
执行命令。它执行的命令需要UAC。这是在Windows Server 2008上,听起来你不能为一个可执行文件禁用UAC所以有没有其他方法可以使这个工作?
答案 0 :(得分:5)
如果您的Java应用程序作为Windows服务运行,它很可能在其中一个系统帐户下运行:SYSTEM(最可能),LOCAL SERVICE或NETWORK SERVICE。因此,如果服务在SYSTEM帐户下运行,则从服务启动的所有内容都将继承该帐户。无论如何,必须允许您的服务与桌面交互。
总而言之,如果您的流程以提升方式运行,那么从它开始的流程也将升级。
要提升,您必须使用Windows API的ShellExecute或ShellExecuteEx功能。如果您正在启动的.exe在其清单中标有level=requireAdministrator
,则shell将显示UAC对话框。如果未标记,则可以使用runas
动词/操作强制执行UAC确认对话框。注意:Windows XP上的runas
将显示“以另一个用户身份运行”对话框。
如果通过ShellExecute实现Runtime.getRuntime().exec(command)
,则使用适当的清单标记.exe将起作用;如果exec
使用CreateProcess,则该过程将以当前用户权限启动,即未提升;此外,如果.exe在其清单中有requireAdministrator
,则根本不会启动该进程。