Come posso ottenere un identificatore univoco per un dispositivo all’interno di Windows 10 Universal?

Questa è la mia vecchia implementazione per ottenere un DeviceID univoco per Windows Universal 8.1 ma il tipo HardwareIdentification non esiste più.

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("-", ""); } 

Questa è la soluzione completa per Windows Desktop:

  • Aggiungere il riferimento di estensione “Estensioni desktop di Windows per l’UWP” come Peter Torr – MSFT menzionato.

Usa questo codice per ottenere l’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!"); } } } 

Sembra che

 var deviceInformation = new EasClientDeviceInformation(); string Id = deviceInformation.Id.ToString(); 

sta facendo la magia, facendo riferimento a EasClientDeviceInformation fornisce un ID unico.

La proprietà Id rappresenta DeviceId utilizzando il GUID troncato dai primi 16 byte dell’hash SHA256 di MachineID, SID utente e Nome famiglia pacchetto in cui MachineID utilizza il SID del gruppo utenti locale.

MA funziona solo per le app di Windows Store … quindi deve esserci un’altra soluzione.

Aggiornamento per Windows 1609 (“Aggiornamento Anniversario”)

Vedi questo Q & A per un modo molto migliore per ottenere un ID.

Informazioni precedenti per build del sistema operativo meno recenti

È necessario aggiungere un riferimento agli SDK desktop e / o mobili per creare il token hardware. In fase di runtime è necessario utilizzare il tipo ApiInformation per interrogare se l’API è presente prima di utilizzarla (altre famiglie di dispositivi come Xbox non ce l’hanno).

Detto questo, molte volte quando le persone chiedono l’ID dispositivo che in realtà non è la soluzione migliore per il loro problema, sei sicuro di dover identificare il dispositivo fisico per tutta la sua durata, anche se la proprietà cambia?

EasClientDeviceInformation non funziona per Windows 10 mobile. L’id del dispositivo è lo stesso per tutti i telefoni (tutti i nostri clienti win10m vengono registrati con lo stesso GUID) Abbiamo bisogno dell’id per l’invio di messaggi push al telefono giusto.

 //you can use this //its working with me very fine on windows 10 //replace the word bios with any hardware name you want //data also can be found with using windows application named (wbemtest) using System.Management; public static async Task ReturnHardWareID() { string s = ""; Task task = Task.Run(() => { ManagementObjectSearcher bios = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS"); ManagementObjectCollection bios_Collection = bios.Get(); foreach (ManagementObject obj in bios_Collection) { s = obj["SerialNumber"].ToString(); break; //break just to get the first found object data only } }); Task.WaitAll(task); return await Task.FromResult(s); }