web-dev-qa-db-fra.com

Comment obtenir un identifiant unique pour un appareil dans Windows 10 Universal?

Il s'agit de mon ancienne implémentation pour obtenir un DeviceID unique pour Windows Universal 8.1, mais le type HardwareIdentification n'existe plus.

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

C'est la solution complète pour Windows Desktop:

  • Ajoutez la référence d'extension "Windows Desktop Extensions for the UWP" comme Peter Torr - MSFT l'a mentionné.

Utilisez ce code pour obtenir le 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!");
        }
    }
}
18
Jens Marchewka

Il paraît que

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

fait la magie, se référant à EasClientDeviceInformation il fournit un identifiant unique.

La propriété Id représente le DeviceId à l'aide du GUID tronqué à partir des 16 premiers octets du hachage SHA256 du MachineID, de l'utilisateur SID et du nom de famille du package où le MachineID utilise le SID du groupe d'utilisateurs local .

MAIS cela ne fonctionne que pour les applications du Windows Store ... donc il doit y avoir une autre solution.

8
Jens Marchewka

Mise à jour pour Windows 1609 ("mise à jour anniversaire")

Voir ce Q&A pour une bien meilleure façon d'obtenir un ID.

Anciennes informations pour les anciennes versions du système d'exploitation

Vous devez ajouter une référence aux SDK Desktop et/ou Mobile pour construire avec le jeton matériel. Au moment de l'exécution, vous devez utiliser le type ApiInformation pour demander si l'API est présente avant de l'utiliser (d'autres familles d'appareils comme Xbox ne l'ont pas).

Cela dit, de nombreuses fois lorsque les gens demandent l'ID de l'appareil qui n'est pas réellement la meilleure solution à leur problème - êtes-vous sûr que vous devez identifier l'appareil physique sur toute sa durée de vie, même si la propriété change?

8
Peter Torr - MSFT

EasClientDeviceInformation ne fonctionne pas pour Windows 10 mobile. L'identifiant de l'appareil est le même pour chaque téléphone (tous nos clients win10m sont enregistrés avec le même GUID) Nous avons besoin de l'identifiant pour envoyer des messages Push au bon téléphone.

1
tobjak75
//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<string> 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);
        }
0
user4773407