加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows-runtime – 如何在Windows 10周年更新中获取唯一的设备I

发布时间:2020-12-14 02:01:50 所属栏目:Windows 来源:网络整理
导读:以前的 Windows 10迭代有 HardwareToken API (aka ASHWID)来获取设备的唯一标识符,但它有几个缺点: 它仅适用于桌面和移动平台,它们要求您将Extension SDK添加到项目中(并且在HoloLens或其他平台上不可用) 在PC上,随着硬件的变化,值可能会“漂移”(即使只是
以前的 Windows 10迭代有 HardwareToken API (aka ASHWID)来获取设备的唯一标识符,但它有几个缺点:

>它仅适用于桌面和移动平台,它们要求您将Extension 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)

解决方法

Updated Nov 3rd 2017 (new Registry value,below)

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或Tmp具有相同的优势.

2017年11月3日结束更新

使用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();
}

如问题中所述,此ID仅应用于后端服务中的关联(例如,用于遥测,广告,使用度量等).它永远不应该用于创建匿名用户帐户,识别或跟踪用户,加密用户数据等.这是因为不同的用户可以共享同一设备,或者同一个用户可以在不同的设备上漫游,因此ID不会t使用用户或他们的数据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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读