2010-08-09 17 views
35

He estado mirando el código en this tutorial, y encontré que usa My.Computer.Name para guardar la configuración que no debe deambular entre las computadoras. Sin embargo, es muy posible que un usuario tenga dos PC idénticas. Si quisieran tener el mismo nombre de usuario en cada PC, por ejemplo, muy bien podrían terminar con dos PC llamadas Username-PC.¿Qué es un buen identificador de PC único?

¿Cuáles son algunos buenos métodos para identificar diferentes PC? ¿Las PC tienen GUID asociados a ellas, o debería considerar extraer el número de serie de algún hardware? No me importa si la identificación persiste a través de la reinstalación de Windows.

(El tutorial he vinculado es en VB.Net, pero estoy poniendo en práctica en C#)

+0

http://stackoverflow.com/questions/671876/whats-a-good-way-to-uniquely-identify-a-computer –

+0

http://stackoverflow.com/questions/99880/generating-a-unique -machine-id –

Respuesta

35

Algunos buenos identificadores:

  • Dirección MAC: Es bastante fácil de conseguir en, y por lo general es único. Sin embargo, puede ser falsificado/cambiado con bastante facilidad, por lo que depende de cuán único debe ser.
  • Número de serie de CPU: no está disponible en muchos sistemas antiguos, pero está ahí. Consulte this MSDN page. No cambiará, pero está vinculado a una computadora.
  • HDD Número de serie: Es probable que no cambie, pero puede ser una molestia si falla la HD. Consulte this MSDN page.
+2

+1 Sí, ten cuidado con el MAC. Tuve un montón de problemas antes con el MAC cambiando y siendo duplicado. AGAVE. –

+0

Cuidado: he visto casos donde la CPU (de una computadora portátil) se tostó y tuvo que ser reemplazada. Nueva CPU, nuevo CPUID. –

+1

@Steven: Buen punto. En general, sin embargo, lo consideraría una de las identificaciones "más confiables" en un sistema. La falla de la CPU es relativamente poco común (en comparación con la falla de HD). También debe tenerse en cuenta que este número podría engomarse cuando comience a tratar con la virtualización. – mattbasta

0

no creo que es posible tener dos ordenadores con el mismo nombre en el mismo dominio. ¿Has intentado capturar el nombre de dominio?

+1

Tengo 2 PC en el mismo dominio con el mismo nombre :-) Tengo arranque dual entre xp y win 7 ... aunque no he arrancado en xp fr en 2 semanas ahora – SQLMenace

+0

@SQLMenace: A menos que tenga el mismo SID, la red todavía los ve como cuadros diferentes. –

+0

Es la misma caja ... Tuve que hacer algunas cosas elegantes para llegar al dominio desde ambas cajas – SQLMenace

0

Echa un vistazo aquí: Getting Service Tag from Dell Machine using .net?

Se podía arrebatar algunos datos exclusivos del registro.

+0

Y cuando el registro cambia ... –

+0

Steven, estos valores específicos son específicos del hardware. – JonH

+1

Cambios de hardware. Unidades de disco, CPU, todo. Cuando se rompe, es reemplazado. –

1

Cada computadora tiene un SID que es único en circunstancias normales.

+3

¿por qué es esta la respuesta aceptada? ¿Qué es este SID y cómo obtenerlo? – Marek

+2

Y ni siquiera es correcto. Por favor, elimine la marca de esta respuesta. El SID (identificador de seguridad) es un identificador generado al instalar Windows. Es muy poco probable que dos computadoras tengan el mismo SID. El SID se diseñó originalmente para identificar a los usuarios de manera única a través de una red. ¿Por qué no es lo suficientemente bueno? Porque si la computadora no se instaló desde cero, sino que se instaló desde una imagen, tendrá el mismo SID de la computadora original. Este método para instalar computadoras es muy común en redes grandes, por lo que SID es una mala opción en la práctica. – DiGMi

+0

@DiGMi, tiene razón acerca de la clonación que da como resultado el mismo SID. Es por eso que dije "en circunstancias normales". Como mencionó en su respuesta, algunas compañías que instalan imágenes clónicas regeneran el SID. –

1

Una cosa que puede usar es el MAC de cualquier interfaz de red. También puede combinar varias fuentes de información. Como HDD Número de serie, mac, tipo de procesador para calcular un hash a partir de él.

+2

Cuantas más fuentes utilice, más confiable será. Sin embargo, mientras más fuentes use, más vulnerable será a los falsos positivos. –

14

Si está en Windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId es único por máquina/por instalación de Windows. donde como en algunas de las otras respuestas como la dirección MAC, Proc SN y HD SN se mantendrá igual entre las reinstalaciones de Windows/situaciones de arranque dual.

+1

¿Es este el número utilizado por Windows para detectar cuándo se ha instalado en una máquina diferente? –

+0

@Steven Sudit, Sí, creo que este número se genera mediante un hash de varias piezas de información HW, las ventanas clave de serie y una marca de tiempo. Cuando activa ventanas, envían la clave de serie y este código y almacenan el código en sus servidores. –

+0

Aquí hay una página wiki hablando sobre t cómo se generan http://wiki.lunarsoft.net/wiki/Product_IDs –

2

Utilice la dirección MAC de la tarjeta de red. Se supone que es único. Sin embargo, se puede cambiar. Depende de cuán maliciosos esperes que sean tus usuarios y cuán crítica es tu aplicación.

algunos ejemplos de código para hacerlo:

public string GetMACAddress() { 
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    ManagementObjectCollection moc = mc.GetInstances(); 

    string MACAddress = String.Empty; 

    foreach (ManagementObject mo in moc) { 
     if (MACAddress == String.Empty) { // only return MAC Address from first card 
      if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString(); 
     } 
     mo.Dispose(); 
    } 

    return MACAddress; 
} 
10

La verdadera respuesta a esa pregunta: No hay tal cosa.

Existen varias soluciones "lo suficientemente cerca", pero cada una de ellas tiene su propia limitación.

Todos los identificadores de hardware - Cambios de hardware. Y, en muchos casos, puede cambiar esos identificadores (por ejemplo, MAC spoofing).

El SID, como ya he comentado, tampoco es tan bueno, porque el SID no cambiará si la computadora se instaló desde una imagen.El SID se genera mediante la instalación de Windows, si Windows no se instaló, pero se copió de una imagen, el SID no cambiará (aunque es común regenerarlo debido a un myth about "security risk"; no puede contar con eso).

Nombre del equipo - Bueno, como se mencionó, Suponen que es único, pero no se aplica de ninguna manera.

Otra solución que puede implementar es generar su propio identificador único y almacenarlo localmente (suponiendo que pueda hacerlo). Nuevamente, esta solución no funcionará si su computadora fue capturada con su aplicación.

La mejor solución para usted realmente depende de lo que está tratando de lograr. Tuve el mismo problema con una red bastante grande, y la mejor solución en mi caso fue el nombre de la computadora. Si está absolutamente seguro de que no se generará una imagen de su proceso, generaría un identificador único con Guid porque probablemente sea el más seguro.

9

Aquí hay una forma única de identificar una computadora. Usando System.Management para obtener Win32_BIOS, puede obtener valores únicos del BIOS de su máquina.

Ver: Clase Win32_BIOS, http://msdn.microsoft.com/en-us/library/aa394077.aspx

using System.Management; 

string UniqueMachineId() 
{ 
    StringBuilder builder = new StringBuilder(); 

    String query = "SELECT * FROM Win32_BIOS"; 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
    // This should only find one 
    foreach (ManagementObject item in searcher.Get()) 
    { 
     Object obj = item["Manufacturer"]; 
     builder.Append(Convert.ToString(obj)); 
     builder.Append(':'); 
     obj = item["SerialNumber"]; 
     builder.Append(Convert.ToString(obj)); 
    } 

return builder.ToString(); 
} 

Con una lógica similar, también puede pasar por "Win32_DiskDrive"; http://msdn.microsoft.com/en-us/library/aa394132.aspx; y obtenga "SerialNumber" para cada unidad física. En este caso, el

foreach (ManagementObject item in searcher.Get()) 

debe encontrar varios elementos

+2

No es seguro usar el número de serie de Bios ya que puede obtener muchas de estas cadenas (idénticas): "Para rellenar por O.E.M.". – movAX13h

0

Tomar tres identificadores que son semi-único y semi-permanente. Use la regla de que 2 de 3 es suficiente para una identificación positiva. Actualice los datos registrados para el 1 de 3 que ocasionalmente es incorrecto.