69 votes

Comment obtenir un identifiant unique d'ordinateur en Java (comme l'identifiant du disque ou de la carte mère) ?

J'aimerais obtenir un identifiant unique pour un ordinateur équipé de Java, sous Windows, MacOS et, si possible, Linux. Cela pourrait être un UUID de disque, le S/N de la carte mère...

Runtime.getRuntime().exec peut être utilisé (il ne s'agit pas d'une applet).

Des idées ?

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.

53voto

Bartosz Firyn Points 639

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

Sur Windows Nano Server 2016, le format est "SerialNumber = xxx". L'exemple de code retournera toujours "=" comme numéro de série. Sur d'autres installations Windows, cela fonctionne pour moi.

23voto

nickk_can Points 219

Il est courant d'utiliser l'adresse MAC associée à la carte réseau.

L'adresse est disponible en Java 6 par le biais de l'API suivante :

Docs Java 6 pour l'adresse matérielle

Je ne l'ai pas utilisé dans Java, mais pour d'autres applications d'identification de réseau, il a été utile.

6 votes

J'y ai pensé, mais quand la carte réseau n'est pas connectée, je ne peux pas obtenir d'adresse MAC.

0 votes

Il est également possible pour l'utilisateur de changer de carte réseau. Sur certains ordinateurs portables, lorsqu'ils fonctionnent sur batterie, la carte Ethernet (filaire) est désactivée pour économiser la batterie et n'est donc pas visible pour le système d'exploitation.

3 votes

Et n'oubliez pas qu'il n'est même pas nécessaire de changer la carte réseau pour usurper le MAC : aboutlinux.info/2005/09/comment-changer-l'adresse-de-votre-mac.html

15voto

Özhan Düz Points 2879

Comme une manière alternative de la solution de Finnw wmic L'utilitaire de ligne de commande peut être utilisé pour interroger les numéros de série des dispositifs. Sans dépendance externe, la plupart des choses WMI peuvent être établies avec wmic.

import java.util.Scanner;

public class GetBiosSerialNumber {

    public static void main(String[] args) throws Throwable {
        // wmic command for diskdrive id: wmic DISKDRIVE GET SerialNumber
        // wmic command for cpu id : wmic cpu get ProcessorId
        Process process = Runtime.getRuntime().exec(new String[] { "wmic", "bios", "get", "serialnumber" });
        process.getOutputStream().close();
        Scanner sc = new Scanner(process.getInputStream());
        String property = sc.next();
        String serial = sc.next();
        System.out.println(property + ": " + serial);
    }
}

12voto

Pedro Ghilardi Points 1064

Que voulez-vous faire avec cet identifiant unique ? Vous pouvez peut-être faire ce que vous voulez sans cet identifiant.

L'adresse MAC est peut-être une option mais ce n'est pas un identifiant unique fiable car l'utilisateur peut changer l'adresse MAC d'un ordinateur.

Pour obtenir l'ID de la carte mère ou du processeur, vérifiez ceci lien .

9voto

finnw Points 24592

Sous Windows uniquement, vous pouvez obtenir l'ID de la carte mère en utilisant WMI par l'intermédiaire d'un pont COM tel que JACOB .

Exemple :

import java.util.Enumeration;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.EnumVariant;
import com.jacob.com.Variant;

public class Test {
    public static void main(String[] args) {
        ComThread.InitMTA();
        try {
            ActiveXComponent wmi = new ActiveXComponent("winmgmts:\\\\.");
            Variant instances = wmi.invoke("InstancesOf", "Win32_BaseBoard");
            Enumeration<Variant> en = new EnumVariant(instances.getDispatch());
            while (en.hasMoreElements())
            {
                ActiveXComponent bb = new ActiveXComponent(en.nextElement().getDispatch());
                System.out.println(bb.getPropertyAsString("SerialNumber"));
                break;
            }
        } finally {
            ComThread.Release();
        }
    }
}

Et si vous choisissez d'utiliser l'adresse MAC pour identifier la machine, vous pouvez utiliser WMI pour déterminer si une interface est connectée via USB (si vous voulez exclure les adaptateurs USB).

Il est également possible d'obtenir l'ID du disque dur via WMI, mais ce n'est pas fiable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X