java getRuntime (). exec um exe que requer o UAC

Portanto, temos um processo Java que é executado como um serviço do Windows. Ele precisa executar um comando com Runtime.getRuntime().exec(command) . O comando que ele executa requer o UAC. Isso é no Windows Server 2008 e soa como você não pode desativar o UAC para um único executável, então há alguma outra maneira de fazer isso funcionar?

Se seu aplicativo Java for executado como um serviço do Windows, ele provavelmente será executado em uma das contas do sistema: SYSTEM (mais provável), LOCAL SERVICE ou NETWORK SERVICE. Portanto, se o serviço for executado na conta SYSTEM, tudo que você iniciar no serviço herdará a conta. De qualquer forma, seu serviço deve ter permissão para interagir com o Desktop.

Para resumir, se o processo for executado como elevado, os processos iniciados a partir dele também serão executados de forma elevada.


Para elevar, você precisa usar as funções ShellExecute ou ShellExecuteEx da API do Windows. Se o arquivo .exe que você está iniciando estiver marcado com level=requireAdministrator em seu manifesto, o shell exibirá a checkbox de diálogo do UAC. Se não estiver marcado, você pode usar runas verb / operation para forçar o diálogo de confirmação do UAC. Nota: as runas no Windows XP mostrarão a checkbox de diálogo “Executar como outro usuário”.

Se Runtime.getRuntime().exec(command) for implementado via ShellExecute, a marcação do exe com o manifesto apropriado funcionará; Se exec usa CreateProcess , o processo será iniciado com privilégios de usuário atuais, ou seja, não elevados; além disso, o processo não será iniciado se o .exe tiver requireAdministrator em seu manifesto.