online newguid length example c# windows uniqueidentifier

c# - newguid - ¿Hay realmente alguna forma de identificar de forma única cualquier computadora en absoluto?



system guid newguid c# (4)

Sé que hay varias preguntas similares en stackoverflow, como las siguientes:

... y docenas más y los he estudiado a todos.

El problema es que algunas de las respuestas aceptadas sugieren que la dirección MAC es un identificador único que es completamente incorrecto. Algunas otras respuestas han sugerido usar una combinación de varios componentes que parece más lógica. Sin embargo, en caso de utilizar una combinación, se debe considerar qué componente es naturalmente poco probable que se cambie con frecuencia. Hace unos días desarrollamos un generador de claves para un problema de licencia de software donde usamos la combinación de CPUID y MAC para identificar un PC de Windows de forma única y hasta que las pruebas prácticas pensamos que nuestro enfoque era lo suficientemente bueno. Irónicamente, cuando lo probamos encontramos tres computadoras que devolvieron la misma identificación con nuestro generador de llaves.

Entonces, ¿hay alguna forma de identificar de manera única cualquier computadora? En este momento, solo tenemos que hacer que nuestro generador de claves funcione en Windows PC. De alguna manera (si es posible) usando c # sería genial ya que nuestro sistema está desarrollado en .net.

Actualizar:

Perdón por crear algunas confusiones y una alarma aparentemente falsa. Descubrimos alguna incorrección en nuestro método para recuperar información de HW. Principalmente pensé en eliminar esta pregunta ya que ahora mi propia confusión se ha ido y creo que una combinación de dos o más componentes es lo suficientemente buena como para identificar una computadora. Sin embargo, luego decidí quedármelo porque creo que debería aclarar qué estaba causando el problema, ya que lo mismo podría dañar a otro tipo en el futuro.

Esto es lo que estábamos haciendo (excluyendo otros códigos):

Estábamos usando una función getManagementInfo para recuperar el MAC y la ID del procesador

private String getManagementInfo(String StrKey_String, String strIndex) { String strHwInfo = null; try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + StrKey_String); foreach (ManagementObject share in searcher.Get()) { strHwInfo += share[strIndex]; } } catch (Exception ex) { // show some error message } return strHwInfo; }

Luego, cuando sea necesario, usamos esa función para recuperar la dirección MAC

string strMAC = getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress");

y para recuperar ProcessorID

string strProcessorId = getManagementInfo("Win32_Processor", "ProcessorId");

En este punto, strMAC contendría más de una dirección MAC si hay más de una. Para tomar solo uno, tomamos los primeros 17 caracteres (12 dígitos MAC y 5 dos puntos entre ellos).

strMAC = strMAC.Length > 17 ? strMAC.Remove(17) : strMAC;

Aquí es donde cometimos el error. Porque getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") devolvía una cantidad de direcciones MAC adicionales que realmente estaban en uso. Por ejemplo, cuando buscamos las direcciones MAC en el símbolo del sistema mediante el comando getmac , mostraba una o dos direcciones MAC para cada computadora, que eran todas diferentes. Pero getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") devolvió de cuatro a cinco direcciones MAC, algunas de las cuales eran idénticas para todas las computadoras. Como acabamos de tomar la primera dirección MAC que devolvió nuestra función en lugar de verificar cualquier otra cosa, las direcciones MAC idénticas se tomaron en strMAC incidente.

El siguiente código de Sowkot Osman hace el truco al devolver solo la primera dirección MAC activa / habilitada:

private static string macId() { return identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled"); } private static string identifier(string wmiClass, string wmiProperty, string wmiMustBeTrue) { string result = ""; System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollection moc = mc.GetInstances(); foreach (System.Management.ManagementObject mo in moc) { if (mo[wmiMustBeTrue].ToString() == "True") { //Only get the first one if (result == "") { try { result = mo[wmiProperty].ToString(); break; } catch { } } } } return result; } //Return a hardware identifier private static string identifier(string wmiClass, string wmiProperty) { string result = ""; System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollection moc = mc.GetInstances(); foreach (System.Management.ManagementObject mo in moc) { //Only get the first one if (result == "") { try { result = mo[wmiProperty].ToString(); break; } catch { } } } return result; }

Sin embargo, tenía toda la razón sobre el problema idéntico de ID de procesador. Los tres devolvieron la misma ID de procesador cuando pusimos el comando wmic cpu get ProcessorId en sus instrucciones de comando.

Ahora hemos decidido usar el número de serie de la placa base en lugar de la ID del procesador para hacer una combinación con la dirección MAC. Creo que nuestro propósito se cumplirá de esta manera y si no lo hace en algunos casos, entonces deberíamos dejarlo ir en esos pocos casos.


Sin embargo, tenía toda la razón sobre el problema idéntico de ID de procesador. Los tres devolvieron la misma ID de procesador cuando pusimos el comando wmic cpu get ProcessorId en sus instrucciones de comando.

La ID del procesador será la misma si todos los sistemas se están ejecutando como máquinas virtuales en el mismo hipervisor.

MAC ID parece estar bien. Lo único es que los usuarios deben tener la opción de restablecer la aplicación, en caso de que el MAC cambie.


¿Qué le parece agregar el número de serie de la placa base, por ejemplo:

using System.management; //Code for retrieving motherboard''s serial number ManagementObjectSearcher MOS = new ManagementObjectSearcher("Select * From Win32_BaseBoard"); foreach (ManagementObject getserial in MOS.Get()) { textBox1.Text = getserial["SerialNumber"].ToString(); } //Code for retrieving Processor''s Identity MOS = new ManagementObjectSearcher("Select * From Win32_processor"); foreach (ManagementObject getPID in MOS.Get()) { textBox2.Text = getPID["ProcessorID"].ToString(); } //Code for retrieving Network Adapter Configuration MOS = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration"); foreach (ManagementObject mac in MOS.Get()) { textBox3.Text = mac["MACAddress"].ToString(); }


El hecho de obtener una ID única a nivel mundial es que solo la dirección MAC es la identificación que no cambiará si configuras tu sistema por completo. SI está generando una clave para un producto específico, la mejor manera de hacerlo es asignar identificaciones únicas para los productos y combinar la identificación del producto con la dirección MAC. Espero eso ayude.


Estoy totalmente de acuerdo con el comentario anterior.

Para licencias de software, puede usar:

Dirección MAC del equipo (tome todo si hay varias tarjetas NIC) + Código de producto del software

La mayoría del vendedor de telecomunicaciones de renombre está utilizando esta técnica.