length generate funciona como java uniqueidentifier uuid

generate - uuid java 8



¿Cómo obtener un identificador único de computadora en Java(como ID de disco o ID de placa base)? (12)

¿Qué quieres hacer con esta identificación única? Tal vez puedas hacer lo que quieras sin esta identificación.

La dirección MAC puede ser una opción, pero esta no es una ID única de confianza porque el usuario puede cambiar la dirección MAC de una computadora.

Para obtener la identificación de la placa base o del procesador en este link .

Me gustaría obtener una ID única para una computadora con Java, en Windows, MacOS y, si es posible, Linux. Podría ser un disco UUID, placa base S / N ...

Runtime.getRuntime().exec se puede usar (no es un applet).

Ideas?


Como una forma alternativa de la solución de finnw, la utilidad de línea de comandos de wmic podría usarse para consultar los números de serie de los dispositivos. Sin dependencia externa, la mayoría de las cosas de WMI podrían establecerse con 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); } }


Creo que deberías mirar este link ... puedes hacer una clave mixta usando varios identificadores como mac + os + nombre de host + link + link .


El problema con la dirección MAC es que puede haber muchos adaptadores de red conectados a la computadora. La mayoría de los más nuevos tienen dos por defecto (wi-fi + cable). En tal situación, uno debería saber qué dirección MAC del adaptador debe usarse. Probé la solución MAC en mi sistema, pero tengo 4 adaptadores (cable, WiFi, adaptador TAP para Virtual Box y uno para Bluetooth) y no pude decidir qué MAC debería tomar ... Si uno decidiera usar un adaptador que está actualmente en uso (tiene direcciones asignadas), aparece un nuevo problema ya que alguien puede tomar su computadora portátil y cambiar el adaptador de cable a wi-fi. Con esa condición MAC almacenada cuando la computadora portátil estaba conectada a través de un cable, ahora no será válida.

Por ejemplo, esos son adaptadores que encontré en mi sistema:

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

Código que he usado para enumerarlos:

Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces(); while (nis.hasMoreElements()) { NetworkInterface ni = nis.nextElement(); System.out.println(ni.getName() + " " + ni.getDisplayName()); }

Desde las opciones, escuche en esta página, la más aceptable para mí, y la que he usado en mi solución es la de @Ozhan Duz, la otra, similar a la respuesta @finnw donde usó JACOB, y vale la pena mencionar es com4j - muestra que hace uso de WMI está disponible here :

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)); }

Esto imprimirá cierta información de la computadora junto con el número de serie de la computadora. Tenga en cuenta que todas las clases requeridas por este ejemplo deben ser generadas por maven-com4j-plugin. Ejemplo de configuración para 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 configuración de arriba indicará al plugin que genere clases en el directorio target / generated-sources / com4j en la carpeta del proyecto.

Para aquellos a los que les gustaría ver una solución lista para usar , incluyo enlaces a las tres clases que escribí para obtener SN de máquina en Windows, Linux y Mac OS:


El proyecto OSHI proporciona utilidades de hardware independientes de la plataforma .

Dependencia de Maven:

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

Por ejemplo, podría usar algo como el siguiente código para identificar una máquina de forma exclusiva:

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); } }

Salida para mi máquina:

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

Su salida será diferente ya que al menos el número de serie del procesador será diferente.


El uso de la identificación MAC es más fácil si la tarea consiste en registrar la identificación única de un sistema.

El cambio de mac id es posible, incluso el cambio de otras identificaciones de un sistema también es posible, es que el dispositivo respectivo es reemplazado.

por lo tanto, a menos que se requiera lo que se necesita para una identificación única, es posible que no podamos encontrar una solución adecuada.

Sin embargo, el siguiente enlace es útil para extraer direcciones mac. http://www.stratos.me/2008/07/find-mac-address-using-java/


En los programas de Java que he escrito para el lanzamiento, utilicé el número de serie de la placa base (que es lo que creo que usan las ventanas); sin embargo, esto solo funciona en Windows ya que mi función crea un script temporal de VB que usa WMI para recuperar el valor.

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; }


Es común usar la dirección MAC asociada a la tarjeta de red.

La dirección está disponible en Java 6 a través de la siguiente API:

Java 6 Docs para dirección de hardware

No lo he usado en Java, pero para otras aplicaciones de identificación de red me ha sido útil.


No sabe todos sus requisitos. Por ejemplo, ¿está tratando de identificar de forma única una computadora de todas las computadoras del mundo, o simplemente está tratando de identificar de manera única una computadora de un conjunto de usuarios de su aplicación? Además, ¿puedes crear archivos en el sistema?

Si puedes crear un archivo. Puede crear un archivo y usar el tiempo de creación del archivo como su identificación única. Si lo crea en un espacio de usuario, identificaría de manera única a un usuario de su aplicación en una máquina en particular. Si lo creó en algún lugar global, podría identificar de manera única a la máquina.

Una vez más, como la mayoría de las cosas, ¿qué tan rápido es lo suficientemente rápido ... o en este caso, lo único es lo suficientemente único.


Para identificar una máquina de Windows de forma única. Asegúrese de usar wmic para tener una estrategia de métodos alternativos. Dado que "wmic bios get serialnumber" podría no funcionar en todas las máquinas, es posible que necesite métodos adicionales:

# Get serial number from bios wmic bios get serialnumber # If previous fails, get UUID wmic csproduct get UUID # If previous fails, get diskdrive serialnumber wmic DISKDRIVE get SerialNumber

Recursos: la mejor forma de identificar de forma única una máquina con Windows http://www.nextofwindows.com/the-best-way-to-uniquely-identify-a-windows-machine/


Solo en Windows, puede obtener la ID de la placa madre usando WMI , a través de un puente COM como JACOB .

Ejemplo:

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(); } } }

Y si elige usar la dirección MAC para identificar la máquina, puede usar WMI para determinar si una interfaz está conectada a través de USB (si desea excluir adaptadores USB).

También es posible obtener una identificación de disco duro a través de WMI, pero esto no es confiable.


Tenga cuidado al usar la dirección MAC como identificador. He experimentado varios errores:

  1. En OS X, los puertos de Ethernet que no están activos / activos no se muestran en NetworkInterface.getNetworkInterfaces() Enumeration.
  2. Es terriblemente fácil cambiar una dirección MAC en las tarjetas si tienes los privilegios adecuados del sistema operativo.
  3. Java tiene la costumbre de no identificar correctamente las interfaces "virtuales". Incluso el uso de NetworkInterface.isVirtual() no siempre te dirá la verdad.

Incluso con los problemas anteriores, sigo creyendo que es el mejor enfoque puro de Java para el hardware que bloquea una licencia.