Le problème de l'adresse MAC est qu'il peut y avoir plusieurs adaptateurs réseau connectés à l'ordinateur. La plupart des ordinateurs les plus récents en ont deux par défaut (wi-fi + câble). Dans une telle situation, il faut savoir quelle adresse MAC de l'adaptateur doit être utilisée. J'ai testé la solution MAC sur mon système, mais j'ai 4 adaptateurs (câble, WiFi, adaptateur TAP pour Virtual Box et un pour Bluetooth) et je n'ai pas réussi à décider quel MAC je devais prendre... Si l'on décide d'utiliser l'adaptateur qui est actuellement utilisé (a des adresses assignées) alors un nouveau problème apparaît puisque quelqu'un peut prendre son ordinateur portable et passer de l'adaptateur câble au wi-fi. Dans ces conditions, le MAC enregistré lorsque l'ordinateur portable était connecté par câble ne sera plus valide.
Par exemple, ce sont des adaptateurs que j'ai trouvés dans mon système :
lo MS TCP Loopback interface
eth0 Intel(R) Centrino(R) Advanced-N 6205
eth1 Intel(R) 82579LM Gigabit Network Connection
eth2 VirtualBox Host-Only Ethernet Adapter
eth3 Sterownik serwera dostepu do sieci LAN Bluetooth
Code que j'ai utilisé pour les répertorier :
Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
while (nis.hasMoreElements()) {
NetworkInterface ni = nis.nextElement();
System.out.println(ni.getName() + " " + ni.getDisplayName());
}
Parmi les options écoutées sur cette page, la plus acceptable pour moi, et celle que j'ai utilisée dans ma solution est celle de @Ozhan Duz, l'autre, similaire à la réponse de @finnw où il a utilisé JACOB, et qui mérite d'être mentionnée est com4j - Un exemple qui fait appel à WMI est disponible aquí :
ISWbemLocator wbemLocator = ClassFactory.createSWbemLocator();
ISWbemServices wbemServices = wbemLocator.connectServer("localhost","Root\\CIMv2","","","","",0,null);
ISWbemObjectSet result = wbemServices.execQuery("Select * from Win32_SystemEnclosure","WQL",16,null);
for(Com4jObject obj : result) {
ISWbemObject wo = obj.queryInterface(ISWbemObject.class);
System.out.println(wo.getObjectText_(0));
}
Cette opération permet d'imprimer certaines informations sur l'ordinateur, ainsi que son numéro de série. Veuillez noter que toutes les classes requises par cet exemple doivent être générées par maven-com4j-plugin. Exemple de configuration pour maven-com4j-plugin :
<plugin>
<groupId>org.jvnet.com4j</groupId>
<artifactId>maven-com4j-plugin</artifactId>
<version>1.0</version>
<configuration>
<libId>565783C6-CB41-11D1-8B02-00600806D9B6</libId>
<package>win.wmi</package>
<outputDirectory>${project.build.directory}/generated-sources/com4j</outputDirectory>
</configuration>
<executions>
<execution>
<id>generate-wmi-bridge</id>
<goals>
<goal>gen</goal>
</goals>
</execution>
</executions>
</plugin>
La configuration ci-dessus indique au plugin de générer les classes dans le répertoire target/generated-sources/com4j du dossier du projet.
Pour ceux qui souhaitent voir prêt à l'emploi solution, j'inclus des liens vers les trois classes que j'ai écrites pour obtenir le SN machine sur Windows, Linux et Mac OS :
1 votes
S'agit-il d'un dispositif anti-piratage ?
3 votes
Ce sera probablement un appel JNI, rien de natif java
1 votes
Oui, c'est pour quelque chose comme un système anti-piratage, pour identifier un ordinateur.
6 votes
Tout ce qui peut être exécuté via exec() peut être remplacé. Tout ce que l'utilisateur de la machine doit faire est de créer un programme qui renvoie toujours le résultat attendu. Pour cela, il suffit de prendre un dump de la machine de travail et d'écrire un programme qui renvoie la même chose (à partir d'un fichier par exemple).