Documentação WMI

8 respostas
Z

alguém que já trabalhou com WMI poderia me fornecer a documentação?

8 Respostas

Rafael_Costa_Teixeir

zehdapora ,

Bom dia !

http://msdn.microsoft.com/en-us/library/aa394554(v=vs.85).aspx

Exemplos de APIs para trabalhar com WMI:

Jacob http://danadler.com/jacob/
Jawin http://sourceforge.net/projects/jawinproject/files/
Com4J http://com4j.java.net/
Jwmi http://henryranch.net/software/jwmi-query-windows-wmi-from-java/

Para brincar com wmi recomendo o wmiexplorer , muito bom.

Se for usar o Jwmi e estiver com probremas com os caracteres acentuados , me posta que te mando o código com a solução.

Z

muito obrigado!

Rafael_Costa_Teixeir

fico feliz em ter ajudado :thumbup:

Z

Estou utilizando o jWMI, mas não tenho conhecimento de todas as propriedades para realizar as WQL, e necessito delas para desenvolver meu TCC. Estou desenvolvendo um estudo de caso utilizando a tecnologia JMX para gerenciar recursos de hardware e software em plataformas Windows e Linux.

Rafael_Costa_Teixeir

Te recomendo fazer o download do wmiexplorer , nele vc pode visualizar todas as classes e os valores de cada um para sua maquina ou de maquina remota na rede.

Segue o link: http://www.hostmonitor.biz/download/wmiexplorer.zip

Segue abaixo uma classe de exemplo que usei para conectar usando Jwmi:

import java.text.Collator;
import java.util.Collections;
import java.util.Vector;

public class WmiConnect {
    /**
     * 
     * @param args
     * @throws Exception
     */
	 
	public synchronized Vector<String> executa (String strQuery,String item_selecionado,String host,String user,String senha) throws Exception {
    	
		//String item = new String();
		Vector<String> vetor = new Vector<String>();
		//Jwmi jwmi = new Jwmi();
		
		try {
			String name = Jwmi.getWMIValue(strQuery,item_selecionado);
			System.out.println(name);
			
			String info[] = name.split("\r\n");
			
			for(int i = 0;i<info.length;i++) {
				info[i] = this.convertAcentosVbs2Java(info[i]);
				vetor.add(info[i]);
				
			}
			
			Collections.sort(vetor,Collator.getInstance() );

			
			//System.out.println(info[2]);
			//System.exit(0);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
return vetor;
	
    }
	public synchronized String executaStr (String strQuery,String item_selecionado,String host,String user,String senha) throws Exception {
    	
		//String item = new String();
		String name = "";
		//Jwmi jwmi = new Jwmi();
		
		try {
			name = Jwmi.getWMIValue(strQuery,item_selecionado);
			System.out.println(name);
			
			/*
			String info[] = name.split("\n");
			
			for(int i = 0;i<info.length;i++) {
				vetor.add(info[i]);
				
			}
			*/
			//System.out.println(info[2]);
			//System.exit(0);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		name = convertAcentosVbs2Java(name);
return name;
	
    }
	
	private String convertAcentosVbs2Java(String str) {
		
		String resultado = "";
		
		try {
			//String wmi = wmiConnect.executaStr("SELECT * FROM Win32_UserAccount WHERE Name='j16315770'", "FullName", "localhost", "", "");
			//System.out.println(wmi);
			//Character letra = new Character('c');
			//char r[] = letra.toChars(8218);
			
			System.out.printf("%c",111);
			//String acentosVbs = "";
			
			String acentosVbs = Jwmi.getVBSAcentos();
			String acentosJava = "àáâãäèéêëìíîïòóôõöùúûüç";
			
			//WmiConnect wmiConnect = new WmiConnect();

			//String resultado = "";
			//String resultadoFinal = "";
			
			resultado = str.replace( acentosVbs.charAt(0), acentosJava.charAt(0));

			
			for(int i = 1;i < acentosVbs.length();i++) {
			System.out.println(acentosVbs.charAt(i)+"Java:"+acentosJava.charAt(i));
				
			resultado = resultado.replace( acentosVbs.charAt(i), acentosJava.charAt(i));
			//resultado = resultado;
			System.out.println("Resultado parcial:"+ resultado);
			//resultadoFinal = resultado;
			//if(i < acentosVbs.length()) {
			//	resultadoFinal = resultado;
			//}
			}
			
			return resultado;
			//System.out.println("Final:"+ resultadoFinal);
			
			//for(int i = 0;i<str.length();i++) {
			//System.out.println(wmi.codePointAt(i));
			//}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultado;
	}
	
	
}

Essa classe acima usa String (uma implementação correta seria usando StringBuffer fique a vontade para modificar).

O Jwmi usa VBS para pegar as informações por esse motivo ele só ira rodar em ambiente Windows.
Caso vc queirar pegar as informações de um servidor Windows a partir de uma maquina Linux ou qualquer outro sistema diferente de Windows , vc pode criar uma aplicação java para ficar ativa no servidor Windows e desenvolver uma aplicação java que se conecta nesse servidor e te retorna as informações coletadas pelo Jwmi.

Espero ter ajudado…

Boa sorte com seu TCC :thumbup:

prog.tiago

Boa tarde zehdapora,

Estou começando a utilizar o JWMI, li seu tópico.
Você recomenda o uso do JWMI ou prefere outra api como o Jacob ou o com4j?

O meu objetivo é controlar filas de impressão.

Abraço

Z

Poderia me passar o método Jwmi.getVBSAcentos() ou apenas os caracteres acentuados padrão do vscript?

Rafael_Costa_Teixeir

zehdapora ,

Bom dia !

Segue abaixo o metodo getVBSAcentos:

public synchronized static String getVBSAcentos() throws Exception
	{
		String vbScript = getVBScriptAcentos();
		String tmpDirName = getEnvVar("TEMP").trim();
		String tmpFileName = tmpDirName + File.separator + "jwmiAcentos.vbs";
		writeStrToFile(tmpFileName, vbScript);
		String output = execute(new String[] {"cmd.exe", "/C", "cscript.exe", tmpFileName});
		
		new File(tmpFileName).delete();
				
		return output.trim();

	}

E o metodo getVBScriptAcentos:

private synchronized static String getVBScriptAcentos()
	{
		
		String vbs = "wscript.echo \"àáâãäèéêëìíîïòóôõöùúûüç\""+CRLF;
		// String vbs = "Dim oWMI : Set oWMI = GetObject(\"winmgmts:\")"+CRLF;
		/*
		vbs += "Dim classComponent : Set classComponent = oWMI.ExecQuery(\""+wmiQueryStr+"\")"+CRLF;
		vbs += "Dim obj, strData"+CRLF;
		vbs += "For Each obj in classComponent"+CRLF;
		String[] wmiFieldNameArray = wmiCommaSeparatedFieldName.split(",");
		for(int i = 0; i < wmiFieldNameArray.length; i++)
		{
			vbs += "  strData = strData & obj."+wmiFieldNameArray[i]+" & VBCrLf"+CRLF;
		}
		vbs += "Next"+CRLF;
		vbs += "wscript.echo strData"+CRLF;
		*/
		return vbs;
	}

Ele só reconhece os caracteres em minusculas , mas não é dificil colocar as maiusculas para reconhecer.

Qualquer duvida só postar.

Criado 13 de setembro de 2011
Ultima resposta 22 de out. de 2011
Respostas 8
Participantes 3