【问题标题】:How to get unique Device IDs on Windows 10 Anniversary Update如何在 Windows 10 周年更新上获取唯一的设备 ID
【发布时间】:2017-03-16 05:14:04
【问题描述】:

以前的 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)

【问题讨论】:

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


    【解决方案1】:

    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 或通用 API 合同 5)开始,a new Registry identification source 提供了一个相对稳定的 ID,以防用户没有合适的硬件。如果用户重新安装操作系统(不是升级,而是新安装)或用户更改注册表,它将改变,但其他方面与UefiTmp 具有相同的好处。

    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 不会与用户或其数据 1:1 映射。

    此 API 在通用 API 合同 v3 中可用,并且可以在 Windows 通用 SDK 版本 10.0.14393.0 中找到(请记住,如果您正在开发多版本应用程序并希望使用此 API,您应该进行运行时版本检查;而应该只进行query the OS to see if the API is available)。

    【讨论】:

    • 我有一个 UWP 应用程序,我希望仅允许此应用程序能够在网站 (.Net Core) 上发布,并可能将其与使用此应用程序的用户联系起来。最适合这种场景的 API 是什么?它将允许我绕过在服务器上创建身份系统的繁重工作。 :)
    • 如果你想阻止恶意用户,这是不可能的。即使您只想防止随意/意外滥用,设备 ID 也无法帮助您识别用户。我建议您查看 ASP 中的身份验证选项。 NET 核心。
    • @PeterTorr-MSFT 我正在使用 Dragonboard 410C 在 IoT Core (10.0.17134.112) 上尝试此操作 - 我遇到了一个问题,即设备电源循环时我返回的 ID 发生了变化。为了存储 id,我将缓冲区转换为十六进制代码,然后创建一个字符串。来源来自 TPM - 知道为什么我在电源循环后得到不同的值吗?
    • 我收到了团队的回复。您需要确保先初始化 TPM,然后它应该是持久的。
    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 2015-11-15
    • 1970-01-01
    • 2017-01-06
    • 2015-10-23
    • 2021-08-27
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多