【问题标题】:WindowsRT Surface(Tablet) identifying [duplicate]Windows RT Surface(平板电脑)识别[重复]
【发布时间】:2014-09-29 09:36:20
【问题描述】:

如何唯一标识一个表面(平板电脑)?如何获取平板电脑的 id?有一种使用“HardwareIdentification.GetPackageSpecificToken(null)”的方法。问题是,它会因简单的硬件更改而发生变化,例如禁用蓝牙。有没有办法为永远不会改变的平板电脑获取唯一 ID?

【问题讨论】:

  • 您的意思是用 asp.net 标记问题吗?如果是这样,你想做什么?
  • ID 需要多长时间很重要,但对于大多数用途(仅限平板电脑,而不是手机),您可以使用EasClientDeviceInformation.Id。此属性为您提供“机器 ID、用户 SID 和包系列名称”组合的 SHA256 哈希值的一半。这永远不会改变(只要你的包系列名称保持不变,它应该),但它会因用户而异,因此它不会唯一标识单个设备。
  • 感谢@NateDiamond。有没有办法识别两个平板电脑,即使它被多个用户使用
  • 我想写一个 storeapp ,因为我想唯一标识两个平板电脑@ErnodeWeerd
  • 如果您解释一下您认为平板电脑的身份可能会有所帮助。如果您解释了您要完成的工作,这也可能会有所帮助。

标签: c# windows-runtime windows-store-apps


【解决方案1】:

你可以使用HardwareIdentification.GetPackageSpecificToken(null),见http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx

该功能为您提供了大量信息,您可以根据需要进行过滤。例如:

using System.Runtime.InteropServices.WindowsRuntime;

public static string GetMachineId()
{
    var hardwareToken = 
        HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray();
    var count = hardwareToken.Length / 4;
    ulong id = 0ul;
    for (int i = 0; i < count; i++)
    {
        switch (BitConverter.ToUInt16(hardwareToken, i * 4))
        {
            case 1:
                // processor
            case 2:
                // memory
            case 9:
                // system BIOS
                id = (id << 12) ^ BitConverter.ToUInt16(hardwareToken, i * 4 + 2);
                break;
        }
    }
    return Convert.ToBase64String(BitConverter.GetBytes(id));
}

但是,请记住,此函数和底层 API 不能保证所有连接到互联网的机器的绝对唯一性。您通常会将其与有关用户的信息结合起来。

另一种选择是生成 GUID 并将其存储在本地(非漫游)存储中,并将其用作您的计算机 ID。根据您的具体需求,这可能是一个更好的解决方案。

更新

Guid 方法相当简单。只需在第一次运行应用程序时生成一个新的 Guid 使用

Guid installationId = Guid.NewGuid();

然后将其存储在本地文件中使用

StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
    "installationId", 
    CreationCollisionOption.FailIfExists);

using (Stream fileStream = await file.OpenStreamForWriteAsync())
{
    await fileStream.WriteAsync(installationId.ToByteArray(), 0, 16)
    await fileStream.FlushAsync();
}

在随后的运行中,您检测到该文件存在并读取它。

此方法的一个可能缺点是,当应用程序被卸载并随后重新安装时,将生成一个新的 GUID。

【讨论】:

  • @KrisVandermotton 。正如我在我的问题中所说,这种方法不会解决我的问题,因为 packagespecificToken 是针对小型硬件更改的更改,例如您关闭蓝牙
  • @MigaraKulasekara 正如我在回答中所说,您可以过滤该信息。添加或删除网络适配器或蓝牙连接时,我展示的功能不会改变其输出。
  • 谢谢@KrisVandermotten,你能解释一下GUID方法吗?
  • @MigaraKulasekara 我已经更新了我的答案。
  • @KrisVandermotton 我的问题仍然没有 100% 解决,因为卸载和重新安装应用程序时 GUID 会发生变化。GetPackageSpecificToken(null) 包含这九个组件,这些组件可以在生命周期内更改软件
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多