Как получить уникальный идентификатор устройства в Windows 10 Universal?

Это моя старая реализация, чтобы получить уникальный DeviceID для Windows Universal 8.1, но тип HardwareIdentification больше не существует.

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

Ответы

Ответ 1

Это полное решение для Windows Desktop:

  • Добавьте ссылку на расширение "Windows Desktop Extensions для UWP", например Peter Torr - MSFT.

Используйте этот код, чтобы получить 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!");
        }
    }
}

Ответ 2

Обновление для Windows 1609 ( "Обновление юбилея" )

См. этот Q & A для гораздо лучшего способа получить идентификатор.

Старая информация для старых версий ОС

Вам нужно добавить ссылку на настольные и/или мобильные SDK для сборки против Hardware Token. Во время выполнения вы должны использовать тип ApiInformation для запроса, если API присутствует перед его использованием (другие семейства устройств, такие как Xbox, не имеют его).

Тем не менее, много раз, когда люди просят идентификатор устройства, который на самом деле не является лучшим решением для их проблемы, вы уверены, что вам нужно идентифицировать физическое устройство на протяжении всего срока его службы, даже если право собственности изменяется?

Ответ 3

Кажется, что

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

делает магию, ссылаясь на EasClientDeviceInformation, он предоставляет уникальный идентификатор.

Свойство Id представляет собой DeviceId, используя GUID, усеченный из первых 16 байтов хеша SHA256 MachineID, SID пользователя и Семейства пакетов, где MachineID использует SID локальной группы пользователей.

НО это работает только для приложений Windows Store..., поэтому должно быть другое решение.

Ответ 4

EasClientDeviceInformation не работает для Windows 10 mobile. Идентификатор устройства одинаковый для каждого телефона (все наши клиенты win10m регистрируются с тем же идентификатором GUID). Нам нужен идентификатор для отправки push-сообщений на правильный телефон.