length - java uuid to string



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

Je voudrais obtenir un identifiant unique à un ordinateur avec Java, sur Windows, MacOS et, si possible, Linux. Il pourrait s'agir d'un UUID de disque, de la carte mère S / N ...

Runtime.getRuntime().exec peut être utilisé (ce n'est pas une applet).

Des idées?


Comme alternative à la solution de wmic , l'utilitaire de ligne de commande wmic pourrait être utilisé pour interroger les numéros de série des périphériques. Sans dépendance externe, la plupart des choses WMI pourraient ê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);
    }
}

Dans les programmes Java que j'ai écrits pour la publication j'ai utilisé le numéro de série de la carte mère (qui est ce que je crois que les fenêtres utilisent); Cependant, cela ne fonctionne que sur Windows car ma fonction crée un script VB temporaire qui utilise WMI pour récupérer la valeur.

public static String getMotherboardSerial() {
      String result = "";
        try {
          File file = File.createTempFile("GetMBSerial",".vbs");
          file.deleteOnExit();
          FileWriter fw = new FileWriter(file);

          String vbs =
             "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
            + "Set colItems = objWMIService.ExecQuery _ \n"
            + "   (\"Select * from Win32_ComputerSystemProduct\") \n"
            + "For Each objItem in colItems \n"
            + "    Wscript.Echo objItem.IdentifyingNumber \n"
            + "Next \n";

          fw.write(vbs);
          fw.close();
          Process gWMI = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
          BufferedReader input = new BufferedReader(new InputStreamReader(gWMI.getInputStream()));
          String line;
          while ((line = input.readLine()) != null) {
             result += line;
             System.out.println(line);
          }
          input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        result = result.trim();
        return result;
      }

Je pense que vous devriez regarder ce link ... vous pouvez faire une clé mixte en utilisant plusieurs identifiants tels que mac + os + nom d'hôte + link + link .


L'utilisation de l' identifiant MAC est plus simple si la tâche consiste à consigner l'identifiant unique d'un système.

le changement d'identifiant mac est bien que possible, même le changement d'autres ids d'un système est également possible est que le dispositif respectif est remplacé.

donc, à moins que ce qui est requis pour un identifiant unique ne soit pas connu, nous pourrions ne pas être en mesure de trouver une solution appropriée.

Cependant, le lien ci-dessous est utile pour extraire les adresses mac. http://www.stratos.me/2008/07/find-mac-address-using-java/


Le projet OSHI fournit des utilitaires matériels indépendants de la plate-forme .

Maven dépendance:

<dependency>
    <groupId>com.github.dblock</groupId>
    <artifactId>oshi-core</artifactId>
    <version>LATEST</version>
</dependency>

Par exemple, vous pouvez utiliser quelque chose comme le code suivant pour identifier une machine de manière unique:

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;

public class ComputerIdentifier
{
    public static String generateLicenseKey() throws Exception
    {
        SystemInfo systemInfo = new SystemInfo();
        OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
        HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
        CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();

        String vendor = operatingSystem.getManufacturer();
        String processorSerialNumber = centralProcessor.getSystemSerialNumber();
        String processorIdentifier = centralProcessor.getIdentifier();
        int processors = centralProcessor.getLogicalProcessorCount();

        String delimiter = "#";

        return vendor +
                delimiter +
                processorSerialNumber +
                delimiter +
                processorIdentifier +
                delimiter +
                processors;
    }

    public static void main(String[] arguments) throws Exception
    {
        String identifier = generateLicenseKey();
        System.out.println(identifier);
    }
}

Sortie pour ma machine:

Microsoft#57YRD12#Intel64 Family 6 Model 60 Stepping 3#8

Votre sortie sera différente car au moins le numéro de série du processeur sera différent.


Ne sachant pas toutes vos exigences. Par exemple, essayez-vous d'identifier de manière unique un ordinateur à partir de tous les ordinateurs du monde ou essayez-vous simplement d'identifier un ordinateur à partir d'un ensemble d'utilisateurs de votre application? Aussi, pouvez-vous créer des fichiers sur le système?

Si vous êtes capable de créer un fichier. Vous pouvez créer un fichier et utiliser l'heure de création du fichier comme identifiant unique. Si vous le créez dans un espace utilisateur, il identifiera de manière unique un utilisateur de votre application sur une machine particulière. Si vous l'avez créé quelque part globalement, il pourrait identifier la machine de manière unique.

Encore une fois, comme la plupart des choses, à quelle vitesse est assez rapide .. ou dans ce cas, comment unique est assez unique.


Que voulez-vous faire avec cet identifiant unique? Peut-être que vous pouvez faire ce que vous voulez sans cette identification.

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

Pour obtenir l'ID de la carte mère ou du processeur, link sur ce link .


Sous Windows uniquement, vous pouvez obtenir l'ID de la carte mère à l'aide de WMI via 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 souhaitez exclure les cartes USB).

Il est également possible d'obtenir un ID de disque dur via WMI, mais cela n'est pas fiable.





uuid