首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows 8的UDID

windows 8的UDID
EN

Stack Overflow用户
提问于 2013-06-03 17:34:03
回答 2查看 6.4K关注 0票数 2

在Windows8上,有没有什么唯一的设备ID (UDID)或类似的ID可以读出,并且不会随着硬件的改变、应用程序的重装等而改变?

如果不是-您自己生成它的最佳方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-03 17:42:05

不是的。是。

不,没有这样的ID,因为(理论上)你可以改变任何硬件组件,这样你可能会得到一个完全不同的ID (这就是为什么微软建议根据ASHWID来计算分数)。

是的,有这样的ID (但它可能不适用于您的情况)。如果你不能依赖硬件,因为它很容易添加内存,更换磁盘,添加另一个网卡(例如,打开/关闭蓝牙或wi-fi),那么你必须依赖一个“软件”ID。

在注册表中,有一个在Windows安装过程中生成的唯一ID,在您重新安装Windows之前,它不会更改。您可以在HKLM/Software/Microsoft/Cryptography中找到这样的ID,它是一个名为MachineGuid的字符串。

如果你能识别出一个你确信不会改变的组件(例如主板),你可以使用一个简单的WMI查询来获得它的序列号,但你应该总是提供一个后备,因为许多MB返回一个假的序列号(而虚拟机可能总是返回相同的序列号)。正确的solution...well是什么取决于你对这个ID做了什么。检查是否有许可证?加密数据?每种方法都有不同的ID“最佳实践”。

获取设备的唯一ID

如果你必须识别一个特定的设备(与用户无关),你有很多选择,我更喜欢做的是只使用稳定的数据(例如,来自主板和BIOS的序列号)生成一个ID。如果他/她完全更新它的硬件,这对你没有帮助,但它应该足够稳定(但你必须定义在你的情况下什么是足够的)。您甚至可以使用主磁盘的序列号(对于便携设备,它非常稳定,您甚至可以将其与其他序列号结合使用来构建您自己的ID)。您可以通过WMI或(如果您的目标是WinRT)通过ASHWID结构的特定字节来获取此信息。

Encrypt data

在这种情况下,您必须考虑何时数据可能无法恢复。如果一个小的硬件改变,你的用户将不能很好地阅读他们以前的文件,他们会不高兴。在这种情况下,我建议使用MachineGuid,除非他们重新安装操作系统,否则他们不必担心(但请帮他们一个忙,并提供一种方法来读取某个地方的GUID )。如果您确定您的目标是手机或平板电脑等便携设备,那么磁盘序列号(或CPU ID,如果可用,或者MB或BIOS)可能也是合适的(因为它们很少见)。

许可

我将使用多个(稳定)ID的组合。至于设备的唯一标识符,你不能确定什么都不会改变。在过去,MAC地址被大量用于此,但移动设备改变了这些规则(因为很容易关闭NIC)。您仍然可以使用它们,但您必须格外小心(和代码)来管理这种情况。同样,当客户更改其硬件/软件设置时,多个ID的组合(仔细选择)可以帮助您最大限度地减少客户的工作量。在这种情况下,一个很好的折衷办法是操作系统序列号(而不是MachineGuid)。如果他们安装了新的操作系统,那么他们也必须更新你的许可证(但我会结合使用它和其他东西,以确保他们不会在多台计算机或虚拟机上使用相同的操作系统副本)。

关于虚拟机的说明

如果您也必须以VM为目标,那么事情就会变得更加复杂。理论上,用户可以使用完全相同的硬件和软件配置创建同一个VM的多个副本。如果这是一个问题,如果您不能正确地解决这个问题(例如,使用网络检查),我建议您根本不支持它们(如果您检测到VM,请退出)。

票数 11
EN

Stack Overflow用户

发布于 2013-11-14 23:23:15

这是一个用JavaScript编写的代码示例,它过滤那些不太可能被更改的硬件模块(CPU、内存大小、磁盘设备的序列号和bios),并将其转换为字符串。代码基于此thread中的代码

代码语言:javascript
复制
// get the hardware Profile id and convert it to byte Array
var hardwareToken = Windows.System.Profile.HardwareIdentification.getPackageSpecificToken(null);
var byteArray = Windows.Security.Cryptography.CryptographicBuffer.copyToByteArray(hardwareToken.id);

var deviceSerial = '',
    offset = 0;
// we filter the hardware modules that are unlikely to be changed, and aggregate them to a string.
while (offset < hardwareToken.id.length)
{
    // CPU ID of the processor || Size of the memory || Serial number of the disk device || BIOS
    if ((byteArray[offset] == 1 || byteArray[offset] == 2 || byteArray[offset] == 3 || byteArray[offset] == 9) && byteArray[offset+1] == 0)
    {
        for (var i=0; i<4; i++)
        {
            deviceSerial += byteArray[offset+i].toString();
        }
    }
    offset += 4;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16893746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档