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

Предыдущие итерации Windows 10 имеют HardwareToken API (он же ASHWID) для получения уникального идентификатора устройства, но у него было несколько недостатков:

  • Он был доступен только на настольных и мобильных платформах, что требовало добавления пакета расширения SDK в ваш проект (и не было доступно на HoloLens или других платформах)
  • На ПК это значение может "дрейфовать" при смене аппаратного обеспечения (даже если подключить ноутбук к док-станции, это изменит идентификатор), поэтому вам необходима сложная логика бэкэнда для сопоставления идентификаторов устройств.
  • Это значение относится только к одному приложению и не может быть распространено между приложениями одним издателем.

Есть ли в Anniversary Update новый способ получить более полезный / стабильный идентификатор, совместимый на всех платформах Windows 10? Я хочу использовать идентификатор в своих приложениях для сопоставления телеметрии с того же устройства в целях использования метрик и рекламы. Я не буду использовать это значение для идентификации пользователя, создания анонимных учетных записей, шифрования данных или чего-либо подобного. Он будет использоваться только для целей телеметрии.

Я хочу сделать что-то вроде:

var id = Windows.Something.GetDeviceId();  // hypothetical OS function
var telemetry = MyApp.GetUsageTelemetry(); // my own function

// Use (eg) HttpClient to send both id and telemetry to my 
// cloud infrastructure for processing and correlation
SendDataToCloudForProcessing(id, telemetry)

1 ответ

Решение

Обновлено 3 ноября 2017 г. (новое Registry значение ниже)

Windows 10 Anniversary Update представила новый SystemIdentification Тип, который делает именно то, что вы хотите. Он имеет несколько преимуществ по сравнению со старым ASHWID:

  • Он доступен на всех платформах Windows 10
    • Примечание: ASHWID теперь также доступен на всех платформах, но все же имеет другие недостатки, перечисленные выше.
  • Он возвращает стабильное значение (даже на ПК), которое не изменится из-за обновления оборудования или переустановки ОС
  • Он возвращает значение, одинаковое для всех приложений одного и того же издателя, что обеспечивает корреляцию в вашем портфеле приложений.
  • Он также может возвращать одинаковое значение во всех приложениях для конкретного пользователя, если у вас есть userSystemInfo Ограниченная возможность
    • Примечание. Это наиболее полезно для сценариев Enterprise; маловероятно, что у вас есть приложение, одобренное для Магазина Windows, которое использует эту функцию без веских на то оснований, поскольку оно представляет собой проблему конфиденциальности

У API есть один небольшой недостаток: он не будет работать на некоторых старых ПК, так как для него требуется UEFI или TPM. Большинство ПК, построенных за последние 5 с лишним лет, должны иметь это оборудование, а все другие устройства, не относящиеся к ПК (телефон, Xbox, HoloLens и т. Д.), Имеют правильное оборудование. Если вы обнаружите ПК без аппаратного обеспечения, вам нужно будет использовать ASHWID или какой-либо другой механизм.

Обновление 3 ноября 2017

Начиная с обновления Windows Fall Creator (1709 или RS3 или Universal API Contract 5), появляется новое Registry источник идентификации, который обеспечивает относительно стабильный идентификатор в случае, если у пользователя нет соответствующего оборудования. Это изменится, если пользователь выполнит новую переустановку ОС (не обновление, а новую установку) или если пользователь изменит реестр, но в остальном имеет те же преимущества, что и Uefi или же Tmp,

Конец обновления 3 ноября 2017

Использовать API просто; нет необходимости в сложном разборе или учете дрейфа на серверной части:

using Windows.System.Profile;

IBuffer GetSystemId()
{
  // This sample gets the publisher ID which is the same for all apps
  // by this publisher on this device.
  // Use GetSystemIdForUser if you have the userSystemId capability
  // and need the same ID across all apps for this user (not 
  // really applicable for apps in the Windows Store)
  var systemId = SystemIdentification.GetSystemIdForPublisher();

  // Make sure this device can generate the IDs
  if (systemId.Source != SystemIdentificationSource.None)
  {
    // The Id property has a buffer with the unique ID
    return systemId.Id;
  }

  // This is a very old PC without the correct hardware. Use 
  // another mechanism to generate an ID (or perhaps just give 
  // up due to the small number of people that won't have the ID; 
  // depends on your business needs).
  return GetIdFromAshwidOrSomethingElse();
}

Как отмечено в вопросе, этот идентификатор должен использоваться только для целей корреляции в серверной услуге (например, для телеметрии, рекламы, метрик использования и т. Д.). Его никогда не следует использовать для создания учетных записей анонимных пользователей, для идентификации или отслеживания пользователей, для шифрования пользовательских данных и т. Д. Это связано с тем, что разные пользователи могут совместно использовать одно и то же устройство или один и тот же пользователь может перемещаться на разных устройствах, поэтому идентификатор не 't сопоставить 1:1 с пользователем или его данными.

Этот API-интерфейс доступен в Universal API Contract v3 и может быть найден в Windows Universal SDK версии 10.0.14393.0 (помните, что если вы работаете с мультиверсионными приложениями и хотите использовать этот API-интерфейс, вам не следует сделать проверку версии во время выполнения, вместо этого вам нужно просто запросить ОС, чтобы увидеть, доступен ли API).

Другие вопросы по тегам