Vejam o que eu fiz

17 respostas
gcobr

Pessoal

Eu tinha o seguinte problema:

Precisava, a partir de uma aplicação Swing, executar alguns aplicativos nativos da plataforma Windows. Alguns exemplos eram lançar applicativos do MS Office, e aplicativos de outros fabricantes de maneira geral.

Então, normalmente um simples Runtime.getRuntime().exec("c:\caminho\app.exe") resolveria, mas eu precisava que a solução fosse mais completa. Podendo por exemplo descobrir se o MS Office estava instalado na máquina além de coletar outras informações diversas a respeito do ambiente desktop em questão.

Então a minha primeira idéia foi usar JNI para realizar operações através da API do próprio Windows ou coletar todas as informações de ambiente que eu precisava no Registro do SO. Só que a minha app é distribuida via Java Web Start e madar DLLs junto com ela não deixaria meus usuários muito felizes. Eu menos ainda.

Aí, na falta de uma alternativa melhor eu implementei a seguinte solução:

Criei um mini-framework capaz de ler dados do registro do Windows que não usa JNI. Ele se baseia em chamadas de linha de comando do SO que pesquisam o registro e retornam o resultado no console, de onde eu o capturo e interpreto.

Ele constrói linhas de comando como:

C:[code]
C:\&gtreg query HKEY_LOCAL_MACHINE\Software\Microsoft\Office
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\Software\Microsoft\Office
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\11.0
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\8.0
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\9.0
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Common
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Delivery
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\PowerPoint
gtreg query HKEY_LOCAL_MACHINE\Software\Microsoft\Office ! REG.EXE VERSION 3.0 HKEY_LOCAL_MACHINE\Software\Microsoft\Office HKEY_LOCAL_MACHINE\Software\Microsoft\Office1.0 HKEY_LOCAL_MACHINE\Software\Microsoft\Office.0 HKEY_LOCAL_MACHINE\Software\Microsoft\Office.0 HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Common HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Delivery HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook HKEY_LOCAL_MACHINE\Software\Microsoft\Office\PowerPoint [/code]

Aí, eu interpreto o resultado com um parser muito simples que eu montei e construo uma arvorezinha de objetos RegistryKey e RegistryValue que representam as chaves e os respectivos valores.

Então, com base neste mini-framework eu vou construir classes que coletam informações no registro a respeito de vários aplicativos que estão ou não instalados na máquina para lançar eles ou fazer outras coisas.

E estas classes podem ser usadas também como parte de uma implementação de integração multi-plataforma que verifica em que plataforma a app está rodando e investiga o ambiente usando este mini-framework ou alguma outra estratégia para as plataformas não Microsoft.

A implementação mencionada funciona, a princípio, com qualquer Win XP, NT ou 2000, pois pelo que sei, todos eles tem o comando 'reg'.

:?: Quem achou a idéia tosca?
:?: Alguém usaria isso?
:?: Coloco no Source Forge?

17 Respostas

T

Interessante - nem sabia que existia esse comando “reg” (acho que minha camisa preta da Microsoft ficou tempo demais guardada no armário).
Estrelinhas para você.

Rafael_Nunes

Isso deve ser interessante para implementar algum tipo de app de auditoria na máquina, que o povo vive perguntando aqui.

Alternativa C

MarcioTavares

Gabriel, e quanto a executar esse comando com um usuário sem privilégios?

Daniel_Quirino_Olive

Interessante para ser usado em aplicações que usem uma JVM anterior a versão 6.0. A partir do JDK 6, existem algumas facilidades para acessar o ambiente onde você está rodando. Então, sim, dá um tapa na interface dos seus objetos, arruma uma documentação DECENTE e faça uns “5-minutes tutorials” para sua biblioteca.

Parabéns :slight_smile:

gcobr

Boa pergunta. Não testei, mas acho que não deve haver problemas, pois o Windows permite que as apps leiam o registro sempre, independente do usuário que estiver logado.

Imagino que a verificação de privilégios, se é que ela existe, deve ser feita dentro de alguma DLL. O reg.exe, deve ser apenas um cliente que usa a DLL, da mesma forma que o regedit (versão visual).

Mas realmente … não sei dizer com 100% de certeza como fica.

Se quiser testar, te passo o fonte.

gcobr

Sim, estou por dentro das novidades. Tudo que foi desenvolvido no JDIC vai entrar no JDK 6 e mais um monte de outras novidades. Um evangelista da Sun me falou isso e a imprensa também tem comentado.

Mas enquanto a primeira versão estável do JDK 6 não for lançada, vou ter que me virar com gambiarras como essa que eu fiz.

Shelson

Parabéns !!!

Coloca no SF.

Eu mesmo estou precisando terminar um software de auditoria e a sua solução seria muito útil.

Daniel_Quirino_Olive

Sim, estou por dentro das novidades. Tudo que foi desenvolvido no JDIC vai entrar no JDK 6 e mais um monte de outras novidades. Um evangelista da Sun me falou isso e a imprensa também tem comentado.

Mas enquanto a primeira versão estável do JDK 6 não for lançada, vou ter que me virar com gambiarras como essa que eu fiz.

Aliás, ao invés de usar o REG.EXE, que tal usar a java.util.preferences API?

gcobr

Daniel Quirino Oliveira:

Aliás, ao invés de usar o REG.EXE, que tal usar a java.util.preferences API?

Sim. Também pensei nisso, mas a única implementação que eu encontrei desta API lia e gravava dados em XML. Não encontrei a tal versão que supostamente usa o registro. E imagino que esta versão deva usar JNI também.

Alguém sabe mais sobre esta API e atual estado dela? E se lê o registro mesmo? E se usa JNI?

T

Daniel Quirino Oliveira:

Aliás, ao invés de usar o REG.EXE, que tal usar a java.util.preferences API?

Porque ela não lê de um lugar arbitrário do Registry, só em uma subchave de \HKEY_CURRENT_USER\Software\JavaSoft\Prefs . Em 99% das vezes não é isso que você quer quando vai usar o Registry.

bzy

Esse comando REG é legal, tem como você explicar ele ou indicar algum lugar.
Como eu faço pra pegar os resultados dessa consulta?

Luca

Olá

gcobr:
Mas enquanto a primeira versão estável do JDK 6 não for lançada, vou ter que me virar com gambiarras como essa que eu fiz.

O Java 6 já está estável. O atual build é o 100. Venho usando-o direto desde o build 86 e não tive nenhum problema. No início de dezembro deverá ser lançado.

Eu já fiz coisas assim usando JNI e ainda acho JNI muito melhor pois me permite verificar muito mais coisas do olhar o registry. O único problema de usar JNI não tem nada a ver com JNI. Meu principal problema foi descobrir onde a Microsoft esconde as informações.

Porém sua solução é boa porque lhe economizou muitos dias vasculhando o MSDN atrás dos esconderijos, das estruturas e dos métodos que devem ser chamados.

[]s
Luca

gcobr

bzy:
Esse comando REG é legal, tem como você explicar ele ou indicar algum lugar.
Como eu faço pra pegar os resultados dessa consulta?

Assim:

String commandLine = "reg query HKEY_LOCAL_MACHINE\Software"; Process process = runtime.exec(commandLine); InputStream processInputStream = process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(processInputStream)); String line = bufferedReader.readLine(); // E por aí vai ...

E para ajuda do comando reg:

c:\> reg /? c:\> reg query /?

gcobr

As classes estão a caminho do Source Forge. Já fiz o registro e estou aguardando (2 dias úteis) a liberação do projeto lá.

Após o commit inicial, quem quiser participar e desenvolver mais coisas em cima destas classes está convidado.

danieldestro

Parabéns, Gabriel! Muito útil.

Kenobi

Realmente, simplicidade é tudo … parabéns !! :slight_smile: Esse é um ótimo exemplo do “jetinho brasileiro” - “A força” sendo usado para o bem :slight_smile:

bzy

Valeu.

Criado 10 de outubro de 2006
Ultima resposta 11 de out. de 2006
Respostas 17
Participantes 10