如何唯一识别表面(平板电脑)?我如何获得平板电脑的身份?有一种方法使用`HardwareIdentification.GetPackageSpecificToken(null)。问题是,它改变了简单的硬件更改,如禁用蓝牙。有没有办法为平板电脑获取永不改变的唯一ID?
答案 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方法非常简单。只需在第一次使用
运行应用时生成新的GuidGuid 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。