Esta es mi implementación anterior para obtener un ID de dispositivo único para Windows Universal 8.1, pero el tipo HardwareIdentification ya no existe.
private static string GetId() { 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).Replace("-", ""); }Esa es la solución completa para Windows Desktop:
Utilice este código para obtener el HardwareId:
using System; using Windows.Security.ExchangeActiveSyncProvisioning; using Windows.System.Profile; namespace Tobit.Software.Device { public sealed class DeviceInfo { private static DeviceInfo _Instance; public static DeviceInfo Instance { get { if (_Instance == null) _Instance = new DeviceInfo(); return _Instance; } } public string Id { get; private set; } public string Model { get; private set; } public string Manufracturer { get; private set; } public string Name { get; private set; } public static string OSName { get; set; } private DeviceInfo() { Id = GetId(); var deviceInformation = new EasClientDeviceInformation(); Model = deviceInformation.SystemProductName; Manufracturer = deviceInformation.SystemManufacturer; Name = deviceInformation.FriendlyName; OSName = deviceInformation.OperatingSystem; } private static string GetId() { if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.System.Profile.HardwareIdentification")) { 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).Replace("-", ""); } throw new Exception("NO API FOR DEVICE ID PRESENT!"); } } }Consulte estas preguntas y respuestas para conocer una forma mucho mejor de obtener una identificación.
Debe agregar una referencia a los SDK de escritorio y/o móvil para compilar contra el token de hardware. En tiempo de ejecución, debe usar el tipo ApiInformation para consultar si la API está presente antes de usarla (otras familias de dispositivos como Xbox no la tienen).
Dicho esto, muchas veces, cuando las personas solicitan la identificación del dispositivo que en realidad no es la mejor solución para su problema, ¿está seguro de que necesita identificar el dispositivo físico durante toda su vida útil, incluso si cambia la propiedad?
Parece que
var deviceInformation = new EasClientDeviceInformation(); string Id = deviceInformation.Id.ToString();está haciendo la magia, refiriéndose a EasClientDeviceInformation proporciona una identificación única.
La propiedad Id representa DeviceId usando el GUID truncado de los primeros 16 bytes del hash SHA256 de MachineID, User SID y Package Family Name donde MachineID usa el SID del grupo de usuarios locales.
PERO solo funciona para las aplicaciones de la Tienda Windows... así que tiene que haber otra solución.