¿Qué es un buen identificador de PC único?

He estado buscando el código en este tutorial , y encontré que usa My.Computer.Name para guardar las configuraciones que no deberían moverse 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.

¿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 que he vinculado está en VB.Net, pero lo estoy implementando en C #)

Algunos buenos identificadores:

  • Dirección MAC: es bastante fácil de alcanzar, y generalmente 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 la CPU: no está disponible en muchos sistemas antiguos, pero está ahí. Echa un vistazo a esta página de MSDN . No cambiará, pero está vinculado a una computadora.
  • Número de serie HDD: Es probable que no cambie, pero puede ser una molestia si falla la HD. Echa un vistazo a esta página de MSDN .

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.

La respuesta real a esa pregunta: no existe tal cosa.

Existen varias soluciones “lo suficientemente cercanas”, 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 bueno, porque el SID no cambiará si la computadora se instaló a partir de 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 mito sobre “riesgo de seguridad” ; no se puede contar en ese).

Nombre del equipo – Bueno, como se mencionó, Ellos 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 hacer tal cosa). 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 su proceso no será fotografiado, generaría un identificador único usando Guid porque probablemente sea el más seguro.

Aquí hay una manera ú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()) 

debería encontrar varios artículos

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

Tome tres identificadores que son semi-únicos y semi-constantes. 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.

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

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

No creo que sea posible tener dos PC con el mismo nombre en el mismo dominio. ¿Has intentado capturar el nombre de dominio?

Eche un vistazo aquí: ¿ Obtiene la etiqueta de servicio de la máquina Dell usando .net?

Puede obtener algunos datos únicos del registro.