如何在Windows 10周年更新中获取唯一的设备ID

时间:2016-11-02 18:51:02

标签: windows-runtime windows-10 windows-10-universal

以前的Windows 10迭代有HardwareToken API (aka ASHWID)来获取设备的唯一标识符,但它有几个缺点:

  • 仅适用于桌面和移动平台,它们要求您在项目中添加扩展SDK(并且在HoloLens或其他平台上无法使用)
  • 在PC上,价值可以"漂移"随着硬件的变化(即使只是将笔记本电脑插入扩展坞也会改变ID),所以你需要complex backend logic to correlate device IDs
  • 该值仅针对单个应用,并且不能由同一发布商在应用之间共享

周年纪念更新中是否有新方法可以获得在所有Windows 10平台上更加有用/稳定的ID?我想在我的应用中使用ID来关联来自同一设备的遥测,以用于使用指标和广告。我不会使用该值来识别用户,创建匿名帐户,加密数据或其他任何类似的东西。它仅用于遥测目的。

我想做类似的事情:

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 个答案:

答案 0 :(得分:7)

  

2017年11月3日更新(下面有新的Registry值)

Windows 10周年更新引入了新的SystemIdentification type,它可以完全满足您的需求。它比旧的ASHWID有几个好处:

  • 它适用于所有Windows 10平台
    • 注意:ASHWID现在也适用于所有平台,但仍有上面列出的其他缺点
  • 返回稳定值(即使在PC上),由于硬件升级或重新安装操作系统而不会改变
  • 它返回的值对于同一发布商的所有应用都是相同的,允许在您的应用组合中进行关联
  • 如果您拥有userSystemInfo Restricted Capability,对于特定用户,它还可以为所有应用返回相同的值
    • 注意:这对企业方案最有用;如果没有很好的理由,您不太可能拥有使用此功能的Windows应用批准的应用,因为它代表隐私问题

API存在一个小缺点:它不能在某些旧PC上工作,因为它需要UEFI或TPM。过去5年以上构建的大多数PC应该具有此硬件,而所有其他非PC设备(手机,Xbox,HoloLens等)都具有正确的硬件。如果您发现没有硬件的PC,则需要回退到ASHWID或其他机制。

2017年11月3日更新

从Windows Fall Creator的更新(又名1709或RS3或Universal API Contract 5)开始,a new Registry identification source提供相对稳定的ID,以防用户没有适当的硬件。如果用户重新安装了操作系统(不是升级,而是新安装),或者用户更改了注册表,则会发生更改,但是与Uefi或{{1}具有相同的好处}。

2017年11月3日结束更新

使用API​​很简单;不需要复杂的解析或计算后端的漂移:

Tmp

如问题中所述,此ID应仅用于后端服务中的关联(例如,用于遥测,广告,使用指标等)。它永远不应该用于创建匿名用户帐户,识别或跟踪用户,加密用户数据等。这是因为不同的用户可以共享同一设备,或者同一个用户可以在不同的设备上漫游,所以ID不会与用户或他们的数据进行1:1的映射。

此API可在Universal API Contract v3中找到,可以在Windows Universal SDK版本10.0.14393.0中找到(请记住,如果您正在执行多版本应用并希望点亮此用法API,您应该执行运行时版本检查;而应该只是query the OS to see if the API is available)。