Как получить уникальный идентификатор для устройства в 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("-", "");
}
5 ответов
Это полное решение для рабочего стола Windows:
- Добавьте ссылку на расширение "Расширения рабочего стола Windows для UWP", как упомянул Питер Торр - 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!");
}
}
}
Обновление для Windows 1609 ("Anniversary Update")
Посмотрите эти вопросы и ответы, чтобы узнать, как лучше получить удостоверение личности.
Старая информация для старых сборок ОС
Вам необходимо добавить ссылку на Desktop и / или Mobile SDK для сборки на основе Hardware Token. Во время выполнения вы должны использовать ApiInformation
введите запрос, если API присутствует перед его использованием (другие семейства устройств, такие как Xbox, не имеют его).
Тем не менее, много раз, когда люди спрашивают идентификатор устройства, который на самом деле не является лучшим решением для их проблемы - вы уверены, что вам нужно идентифицировать физическое устройство на протяжении всего срока его службы, даже если меняется владелец?
Кажется, что
var deviceInformation = new EasClientDeviceInformation();
string Id = deviceInformation.Id.ToString();
делает магию, ссылаясь на EasClientDeviceInformation, он предоставляет уникальный идентификатор.
Свойство Id представляет идентификатор устройства с использованием идентификатора GUID, усеченного из первых 16 байтов хэша SHA256 MachineID, SID пользователя и имени семейства пакетов, где MachineID использует SID локальной группы пользователей.
НО это работает только для приложений Магазина Windows... так что должно быть другое решение.
EasClientDeviceInformation не работает для Windows 10 для мобильных устройств. Идентификатор устройства одинаков для каждого телефона (все наши клиенты win10m регистрируются с одинаковым GUID). Нам нужен идентификатор для отправки push-сообщений на нужный телефон.
//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);
}