Windows RT Surface(平板电脑)识别

时间:2014-09-29 09:36:21

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

如何唯一识别表面(平板电脑)?我如何获得平板电脑的身份?有一种方法使用`HardwareIdentification.GetPackageSpecificToken(null)。问题是,它改变了简单的硬件更改,如禁用蓝牙。有没有办法为平板电脑获取永不改变的唯一ID?

1 个答案:

答案 0 :(得分:0)

您可以使用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。