[Java]CIM

Canard007 Messages postés 5936 Statut Contributeur -  
 JavaLover -
Salut à tous,

Petite question pointue ^^
Comment faire pour se connecter à la base CIM de windows en java et effectué une requete du style select * FROM Win32_process par exemple...

un bon point a celui qui a une reponse ^^
A voir également:

9 réponses

JSS Messages postés 3745 Statut Contributeur 32
 
je crois que ta question est vraiment super pointue ....

up :-)

JSS.désolé.mais.je.connais.pas.:-(
0
Canard007 Messages postés 5936 Statut Contributeur 215
 
En gros j voudrai savoir si il y a moyen d'utiliser une objet wmi en java...

voila plus de detail sur mes recherches...

J'ai un peu chiné et apparement avec le package javax.Wbem.cim on peut acceder à la CIM cependant je ne l'ai vu que pour solaris donc je me pause les questions suivantes..
est ce que ce package fonctionne sous windows..meme maniere de fonctionner etc..
enfin si cela ne convient pas sous windows quelqu'un à t'il une solution alternative..
j'ai vu egalement sur le net le jacob project qui permet de manipuler des activx mais la le probleme c est que j ai pas assez de doc pour savoir comment manipuler les methodes pour faire ma requete sur la CIM...
Bon apparement avec jacob j arrive a creeer l activx coresondant a l objet wmi je dit bien apparement car vu que je n ai aucun exemple de dispatch sur celui ci je ne sait pas trop comment l utiliser :/

j ai tenté un truc du style (bon ca marche pas au niveau du dispatch c est normal je l ai fait au pifometre..

import java.sql.Connection;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;




/**
 * @author SPetit
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */



public class Win32Cim {
	public static void main(String args[]){
		try {
			ActiveXComponent wmi = new ActiveXComponent("winmgmts:{impersonationLevel=impersonate}!\\\\127.0.0.1\\root\\cimv2");
			Object query = wmi.getObject();
			Object test = Dispatch.call(query,"ExecQuery","Select * From win32_process");
			Variant variant = new Variant(false);
			variant = Dispatch.get(test,"name");
			
			
		} 
		catch (Exception e) {
			System.out.println("Exception: "+e);
		}	
	}
}


Bon jusqu au get object tout va bien c est pres il aime pas ..si quelqu'un à une idee...
J'espere avoir etait assez clair et merci d'avance pour votre aide..
0
Canard007 Messages postés 5936 Statut Contributeur 215
 
bon je tente une reduction de ma demande on sait jamais... ;-)

arg!!
avec jacob j arrive a créer mon activx :

ActiveXComponent wmi = new ActiveXComponent("winmgmts:{impersonationLevel=impersonate}!\\\\127.0.0.1\\root\\cimv2");

je suis super content mais maintenant quand j essaye de recuperer les propriété /methode/dispatch (j suis pas un pro en la question donc je sais pas trop) je n y arrive pas..j ai teste un truc du genre:

Object select = Dispatch.get(wmi,"ExecQuery");

le probleme c est qu il me fait une exeption en me disant qu il n arrive pas a maper ExecQuery

Quelqu'un sait il ou je peu trouver les nom des propriété /methode/dispatch de cet objet???
0
Canard007 Messages postés 5936 Statut Contributeur 215
 
Merci à tous ceux qui m ont lu...
le probleme est reglé..

Tout marche bien j suis happy..

JE FAIS DU WMI EN JAVA
truc de ouf ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Canard007 Messages postés 5936 Statut Contributeur 215
 
je tiens a disposition mon code pour les eventuel interréssé ^^
0
Christophe
 
Bravo !
je serai intéressé par voir à quoi ca ressemble car je suis à le recherche de qqchse de similaire.

Pouvez-vous me l'envoyer par retour de mail ?

Merci
0
Canard007 Messages postés 5936 Statut Contributeur 215
 
je le ferai volontier mais il me faudrai ton mail....
je poste ici une partie
sinon le projet sur laquelle je me suis basé est la...
http://danadler.com/jacob/
c'est à eux surtout qu'il faut dire merci...;-)
mais je crois que le site est down en ce moment
donc faut recuperer les .jar sur leur site (jacob.jar)

et apres voila un exemple de ce que je fait:

le "principal"
/*
 * Created on 5 juil. 2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */




package WmiQueryInterface;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Variant;



/**
 * @author SPetit
 * 
 * java WmiQueryInterface.Win32Cim "Select * From Win32_Process"
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */




public class Win32Cim {
	
	public static String TargetIp;
	public static String query;
	public static Object querysubclasse; 
	public static ActiveXComponent wmi;
	
	public static void main(String args[]){
		try {
			
			//declarations:
			String Tabproperties[]=null;
			StringBuffer queryresult = new StringBuffer();
			
			
			//SPTODO : Passage de parametres complementaires comme
			//l ip de la machine a  "requeter"
			//verification du nombre de parametres en entrée
			int nb_args = args.length;
			if(nb_args>2)return;
			else{
				TargetIp =args[0];
				if(nb_args==2)query = args[1].toString();
			}
			
			
			
			/*
			 *  Pour test recuperation chaine et ip via saisie utilisateur
			 */
			
			/*
			System.out.println("saisir une requete ou appuyer sur entrée :");
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			String retour = br.readLine();
			if(!"".equals(retour))
			{
			*/	
				query="Select * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE";
			/*
			}
			System.out.println("saisir target ip ou appuyer sur entrée :");
			br = new BufferedReader(new InputStreamReader(System.in));
			retour = br.readLine();
			if(!"".equals(retour))
			{	
				TargetIp=retour;
			}*/
			
			TargetIp = "iteis040018";//"iteis010109";//"10.177.235.156";
			
			/*
			 * Creation de l objet wmi (connection à la base)
			 */
			
			try
			{
				String username = "Administrateur";
				String password = "";
				//init
				wmi = new ActiveXComponent("WbemScripting.SWbemLocator");					
				//	connection au serveur
				Variant varRet;
				//nombre de parametres
				Variant varParams[] = new Variant[4];
				
				//les 2 parametres
				varParams[0] = new Variant(TargetIp);
				varParams[1] = new Variant("root\\cimv2");
				varParams[2] = new Variant(username);
				varParams[3] = new Variant(password);
				
				//connection au serveur
				varRet = wmi.invoke("ConnectServer", varParams);
				//recuperation du dispatch de l objet resultant
				querysubclasse = varRet.toDispatch();
			}
			catch (Exception e) { 
						System.out.println("Exception: "+e);
						return;
			}	
			
			
					
			/**
			 * 
			 * cas d'une requet SELECT
			 * 
			 */	
			
			//verification de la requete
			String tablename=null;
			StringTokenizer stoken = new StringTokenizer(query);
			for(int i=0;i<4;i++)
			{
				tablename = stoken.nextToken(" ");
			}		
					
			//recuperation des propriétés
			stoken = new StringTokenizer(query);
			if(!(stoken.nextToken("*").equals(query))&&(tablename!=null))
			{
				//recuperation de la liste des propriétés
				CimProperties Prop = new CimProperties(querysubclasse);
				Tabproperties = Prop.GetProperties(tablename);
			}
			
			else
			{
				//local variable
				ArrayList arrayprop = new ArrayList();
				stoken = new StringTokenizer(query);
				stoken.nextToken(" ");
				String properties = stoken.nextToken(" ");
				stoken = new StringTokenizer(properties);
				
				
				//rcuperation des prop dans la requete
				while (stoken.hasMoreTokens()) {
					arrayprop.add(stoken.nextToken(","));
				}
				Tabproperties = new String[arrayprop.size()];
				for (int i = 0; i < arrayprop.size(); i++) {
					Tabproperties[i] = (String) arrayprop.get(i);				
				}
			}
					
			//recherche des donnees
			if((Tabproperties!=null)&&(query!=null))
			{
				CimValues Val =  new CimValues(Tabproperties,querysubclasse,query);
				queryresult = Val.GetValues();
			}
			
			//ecriture du resultat dans un fichier
			File fichier = new File("Result.xml");
			FileWriter fluxecriture = new FileWriter(fichier);
			fluxecriture.write(queryresult.toString());
			fluxecriture.close();
		
			//ecriture console
			//System.out.println(queryresult);
			
			
			//execution d'un exe sur une machine distante
			CimExecute exec = new CimExecute(querysubclasse);
			exec.Execute();
				
		} 
		catch (Exception e) {
			System.out.println("Exception: "+e);
		}	
	}

} 



Recherche des propriétés d'un table CIM

/*
 * Created on 8 juil. 2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

package WmiQueryInterface;
import com.jacob.com.Dispatch;
import com.jacob.com.EnumVariant;
import com.jacob.com.Variant;
import java.util.ArrayList;

/**
 * @author SPetit
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class CimProperties {

	
	static Object querysubclasse;
	public String tabproperties[];
	static ArrayList resultats = new ArrayList();

	public CimProperties(Object activx) {
		//initialisation
		querysubclasse = activx;
	}
	
	public void GetSubClasses(){
		try
		{
			/*
			 * Recuperation de la liste des classes wmi
			 */
			Variant subclasselist = Dispatch.call(querysubclasse, "SubclassesOf");
			Object enumsubclasselist = subclasselist.toDispatch();
			EnumVariant penumsubclasselist = new EnumVariant(enumsubclasselist);
			
			Variant varenumsubclasselist;
			while((varenumsubclasselist = penumsubclasselist.Next())!=null)
			{
				Object objenumsubclasselist = varenumsubclasselist.toDispatch();
				Variant retenumsubclasseelement = Dispatch.call(objenumsubclasselist,"path_");
				String resultat = retenumsubclasseelement.toString();
				System.out.println(resultat);
			}
			int z= 0;
		}
		catch (Exception e) {
			System.out.println("Exception: "+e);
		}	
	}
	public String[] GetProperties(String classepath){
			try
			{
				//recherche des propriétés
				Variant varclasse = Dispatch.call(querysubclasse, "Get",classepath);
				Object classe = varclasse.toDispatch();
				Variant peopertieslist = Dispatch.call(classe,"properties_");
				
				Object liste = peopertieslist.toDispatch();
				EnumVariant pliste = new EnumVariant(liste);
				
				Variant elementliste;
				while((elementliste = pliste.Next())!=null)
				{
					Object objenumsubclasselist = elementliste.toDispatch();
					Variant retelement = Dispatch.call(objenumsubclasselist,"name");
					resultats.add(retelement.toString());
				}		
				tabproperties = new String[resultats.size()];
				for (int i = 0; i < resultats.size(); i++) {
					tabproperties[i] = (String) resultats.get(i);				
				}
				return tabproperties;
				
			}
			catch (Exception e) {
				System.out.println("Exception: "+e);
				return null;
			}
	}	
}



recuperation des valeurs

/*
 * Created on 8 juil. 2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
 
package WmiQueryInterface;
import java.util.StringTokenizer;
import com.jacob.com.Dispatch;
import com.jacob.com.EnumVariant;
import com.jacob.com.Variant;


/**
 * @author SPetit
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class CimValues {
	
	
	static Object ObjConnect;
	static String TabProperties[];
	static int NB_PROPERTIES;
	static String querystring;
	static String tablename;
	static String elementname;
	
	public CimValues(String Tabprop[],Object activx,String query){
		
		//initialisation
		querystring = query;
		TabProperties = Tabprop;
		ObjConnect = activx;
		NB_PROPERTIES = Tabprop.length;
		
		//decoupage de la querystring
		StringTokenizer st = new StringTokenizer(query);
		for(int i=0;i<4;i++)
		{
			tablename = st.nextToken(" ");
		}
		st = new StringTokenizer(tablename);
		for(int i=0;i<2;i++)
		{
			elementname = st.nextToken("_");
		}
	}
	public StringBuffer GetValues()
	{
		StringBuffer XmlStream = new StringBuffer();  
		Variant selectParam = new Variant(querystring);
		Variant retquery = Dispatch.call(ObjConnect, "ExecQuery", selectParam);
		Object enumvalues = retquery.toDispatch();
		EnumVariant penumvalues = new EnumVariant(enumvalues);
		Variant ElementEnum;
		XmlStream.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
		XmlStream.append("<"+tablename+">\n");		
		while((ElementEnum = penumvalues.Next())!=null)
		{
			XmlStream.append("<"+elementname+">\n");
			for(int i =0;i<NB_PROPERTIES;i++)
			{
				Object obEnum = ElementEnum.toDispatch();
				Variant RetValue = Dispatch.call(obEnum,TabProperties[i]);
				String resultat = RetValue.toString();
				if("???".equalsIgnoreCase(resultat))
				{
					String test=TabProperties[i]+"(0)";
					try
					{
						RetValue = Dispatch.call(obEnum,test);
						resultat = RetValue.toString();
						int z=0;
					}
					catch(Exception e) {}
					
				}
				XmlStream.append("<"+TabProperties[i]+">"+resultat+"</"+TabProperties[i]+">\n");
			}
			XmlStream.append("</"+elementname+">\n");
		}
		XmlStream.append("</"+tablename+">\n");
		return XmlStream;
	}

}



bon j 'ai encore un probleme pour recuperer le contenu des tableaus de chaines de caractéres...je sais pas comment recuperer leur dispatch...enfin j vais bien trouver ^^
sinon pour l'insertion dans la table c 'est plus chaud car pour certaine methode ya une reecriture dans les arguments (ce qui implique les poinyeurs..chose difficil à obtenir en java)

bon courage et tiens moi au jus..et n'hesite pas à me poser des questions sur le code ;-)

Seigneur canard a votre service
COIN!
0
Fabrice L.
 
Bonjour

je viens de voir ton post concernant la communication entre Java et WMI, je prépare un diplôme d'ingé au CNAM et j'ai comme projet de faire un truc "similaire" sous Windows et Linux.

J'aurais savoir si tu pouvais me donner plus d'infos sur ce que tu voulais faire exactement, et surtout si aujoud'hui ça tournait.

En fait ce qui me gêne dans ton code c'est l'utilisation de l'activex car tu perds l'aspect portable de JAVA.

Merci de ta réponse
0
Canard007 Messages postés 5936 Statut Contributeur 215 > Fabrice L.
 
Bonjour,

alors oui cela tourne.
En effet l'utilisation de l'activex me fait perdre la portabilité mais l'objet de ce que je voulais faire c'estait de pouvoir consulter les informations system d'une machine sous windows avec java.
Enfin pouvoir inter agir avec la base CIM.
Ce qui en natif n'est pas possible avec java.

Comme il n'y a pas d'api (java) dispo pour communiquer via WMI.
La seul solulion etait de s'interfacer avec l'activex dispo (mais pas tres documenté) .
Enfin si tu veux un peux plus de renseignement ou les sources completes fait moi signe.
0
Fabrice L.
 
Bonjour
Je te remercie pour ta réponse, en fait je vais t'expliquer un peu plus en détail ce que je souhaite faire, c'est réaliser un inventaire de parc "portable" via wbem (norme qui définit le protocole WMI).

Maintenant j'ai comme inpératif d'utiliser JAVA (langage que je ne maîtrise pas, mais ça c'est un détail). Ce qui pourrait s'avérer intéressant dès lorsd c'est d'utiliser WBEM/CMI sous windows via WMI, mais aussi sous linux. J'ai trouvé pas mal d'infos à ce sujet comme WBEMServices qui fournit des classes JAVA qui semblent bien aller pour utiliser WMI.

Avais tu été fouiller dans ce coin (coin) là ou non ?

Qu'en penses tu ?

Meric de ton aide
0
Canard007 Messages postés 5936 Statut Contributeur 215
 
Oui il semblerai bien qu'il y ai pas mal de package permettant de faire cela sous unix ou linux. (à l'origine de la base CIM piqué par windows à partir de windows 2000).
Donc pour faire ton inventaire de machine linux/unix cela devrait etre plutot simple.
Par contre pour windows c'est une autre affaire. je vais t'avouer que depuis septembre 2004 je n'ai pas appronfondi le sujet donc je ne sais pas si il y a un nouveau package dispo permettant de le faire.
Le code que je presente la est en fait ma reponse à cette absence en 2004 (meme si je n'ai pas tout developpé puisque j'ai utiliser un package open source permettant deja d'interfacer les activex).

apres faut savoir sous quel os ton appli va tourner?
ya des solutions alternatives pour windows avec l'execution de VBscript par exemple.
0
Fabrice L.
 
pas mal de package sous linux c'est un grand mot :P mais effectivement la debian semble désormais intégrer openWBEM (équivalent de WMI)

Je comprends que tu n'ais pas approfondi le sujet, depuis 2004 c'est vieux LOL, et je dois avouer que l'idée n'est pas mauvaise d'utiliser l'activeX.

concernant l'OS l'impératif du CNAM c'est Linux (Debian) mais accessoirement Krosoft, d'où le fait qu'ils imposent JAVA (dans ce cas tu "t'affranchis" théoriquement de l'OS)

Pour Windows j'ai déjà fait tourné pas mal de trucs avec WMI, en développant des scripts en Wscript et en VBS, ainsi que des trucs sous Excel (si si ça fonctionne) et c'est vrai que dans ces cas là c'est vraiment simple, mais effectivement en java ça semble se compliquer (mais déjà JAVA est compliqué non ?

Meric encore pour tes remarques.
0
JavaLover
 
Bonjour Canard007
je souaite accéder au repository WMI via java. Je voudrai réutiliser ton code mais je n'arrive pas à le compiler.
ça bloque au niveau de cette instruction.
CimExecute exec = new CimExecute(querysubclasse);
Rq: j'ai déjà mis jacob.jar dans le CLASSPATH.
Merci d'avance
0