¿Cómo obtengo un identificador único para una máquina que ejecuta Windows 8 en C#?
windows-8 windows-store-apps (4)
Estoy trabajando en una aplicación de Metro escrita en C # y necesito una manera única de identificar un dispositivo. Encontré el ASHWID en la documentación que se ve genial. El código sugerido es el siguiente:
HardwareToken token = HardwareIdentification.GetPackageSpecificToken(null);
IBuffer hardwareId = token.Id;
IBuffer signature = token.Signature;
IBuffer certificate = token.Certificate;
El problema es, ¿cómo convierto ese IBuffer en una cadena que puedo usar?
Después de mucho buscar sugerencias que en realidad estaban en JS o C ++ ¡finalmente encontré una respuesta!
private string GetHardwareId()
{
var token = HardwareIdentification.GetPackageSpecificToken(null);
var hardwareId = token.Id;
var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);
byte[] bytes = new byte[hardwareId.Length];
dataReader.ReadBytes(bytes);
return BitConverter.ToString(bytes);
}
Gracias por ir a este blog: http://bartwullems.blogspot.co.uk/2012/09/windows-8-unidently-identifying-device.html
Esto debería funcionar también, pero no tengo Windows 8 para probar con ...
private string GetHardwareId()
{
return BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray());
}
Y si lo llamas más de una vez, es posible que quieras pegarlo en un Lazy<T>
private static Lazy<string> _hardwareId = new Lazy<string>(() => BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray()), true);
public string HardwareId()
{
return _hardwareId.Value;
}
O simplemente hazlo estático si sabes que siempre se llamará:
public static readonly string HardwareId = BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray()));
Para una ID de guía, puede hacer lo siguiente como una extensión de la respuesta anterior
private Guid GetHardwareId()
{
var token = HardwareIdentification.GetPackageSpecificToken(null);
var hardwareId = token.Id;
var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);
byte[] bytes = new byte[hardwareId.Length];
dataReader.ReadBytes(bytes);
byte[] deviceId = new byte[16];
Array.Copy((byte[])bytes, deviceId, deviceId.Length);
return new Guid(deviceId);
}
Puede usar HardwareIdentification.GetPackageSpecificToken(null)
, consulte http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx
Esa función te brinda mucha información, que puedes filtrar a tu gusto. Por ejemplo:
public static string GetMachineId()
{
var hardwareToken =
HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray();
var count = hardwareToken.Length / 4;
ulong id = 0ul;
for (int i = 0; i < count; i++)
{
switch (BitConverter.ToUInt16(hardwareToken, i * 4))
{
case 1:
// processor
case 2:
// memory
case 9:
// system BIOS
id = (id << 12) ^ BitConverter.ToUInt16(hardwareToken, i * 4 + 2);
break;
}
}
return Convert.ToBase64String(BitConverter.GetBytes(id));
}
Sin embargo, tenga en cuenta que esta función y la API subyacente no pueden garantizar la exclusividad absoluta en todas las máquinas conectadas a Internet. Normalmente combinaría esto con información sobre el usuario.
Otra opción es generar y almacenar un GUID en el almacenamiento local (no itinerante) y usarlo como su id. De máquina. Dependiendo de sus necesidades exactas, esta puede ser una mejor solución.