如何在 Windows 10 Universal 中获取设备的唯一标识符?

Posted

技术标签:

【中文标题】如何在 Windows 10 Universal 中获取设备的唯一标识符?【英文标题】:How do I get a Unique Identifier for a Device within Windows 10 Universal? 【发布时间】:2015-10-23 03:48:54 【问题描述】:

这是我为 Windows Universal 8.1 获取唯一设备 ID 的旧实现,但 HardwareIdentification 类型不再存在。

    private static string GetId()
    
        var token = HardwareIdentification.GetPackageSpecificToken(null);
        var hardwareId = token.Id;
        var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);

        byte[] bytes = new byte[hardwareId.Length];
        dataReader.ReadBytes(bytes);

        return BitConverter.ToString(bytes).Replace("-", "");
    

【问题讨论】:

仅供参考,Anniversary Update 中还有更好的方法 是否可以从 Windows 中看到相同的 ID,可能是命令行或设置中。??我的意思是这个硬件 ID 实际出现在哪里。 【参考方案1】:
//you can use this
//its working with me very fine on windows 10
//replace the word bios with any hardware name you want
//data also can be found with using windows application named (wbemtest) 

using System.Management;
public static async Task<string> ReturnHardWareID()
        
            string s = "";
            Task task = Task.Run(() =>
            
                ManagementObjectSearcher bios = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS");
                ManagementObjectCollection bios_Collection = bios.Get();
                foreach (ManagementObject obj in bios_Collection)
                
                    s = obj["SerialNumber"].ToString();
                    break; //break just to get the first found object data only
                
            );
            Task.WaitAll(task);

            return await Task.FromResult(s);
        

【讨论】:

【参考方案2】:

Windows 1609 更新(“周年更新”)

请参阅this Q&A,了解获取 ID 的更好方法。

旧操作系统版本的旧信息

您需要添加对桌面和/或移动 SDK 的引用以针对硬件令牌进行构建。在运行时,您应该使用 ApiInformation 类型来查询 API 是否存在,然后再使用它(Xbox 等其他设备系列没有它)。

也就是说,很多时候,当人们询问设备 ID 时,这实际上并不是解决他们问题的最佳解决方案 - 您确定需要在物理设备的整个生命周期内对其进行识别,即使所有权发生变化?

【讨论】:

不,我只需要某种唯一的 ID 女巫来识别滥用 APP 的设备以锁定 APP 的某些功能。还要为这个用户(聊天)在我们的数据库中关联推送 Uri。 设备 ID 无法识别用户。它识别设备。您需要实施另一种机制来生成和跟踪用户 ID(或依赖第三方登录,如 Facebook 或 Microsoft 帐户) 这正是我们不想要的。因为您可以创建新帐户再次滥用我们的服务。 如果在重置设备时 ID 发生了变化,那么您的方法将不起作用(Bob 被禁止;Bob 重置设备;Bob 被取消禁止)。 硬件令牌是可以的,只要您在将设备提供给其他用户时有缓解措施。如果您只是禁止 DoS 类型的攻击(在很短的时间窗口内),应该没问题。【参考方案3】:

EasClientDeviceInformation 不适用于 Windows 10 移动版。每部手机的设备 ID 都是相同的(我们所有的 win10m 客户都使用相同的 GUID 注册)我们需要该 ID 才能将推送消息发送到正确的手机。

【讨论】:

我们有解决方案吗? EasClientDeviceInformation 为所有手机提供相同的 id【参考方案4】:

这就是 Windows 桌面的完整解决方案:

添加扩展参考“UWP 的 Windows 桌面扩展”,如 Peter Torr - 提到的 MSFT。

使用此代码获取 HardwareId:

using System;
using Windows.Security.ExchangeActiveSyncProvisioning;
using Windows.System.Profile;

namespace Tobit.Software.Device

    public sealed class DeviceInfo
    
        private static DeviceInfo _Instance;
        public static DeviceInfo Instance
        
            get 
                if (_Instance == null)
                    _Instance = new DeviceInfo();
                return _Instance; 

        

        public string Id  get; private set; 
        public string Model  get; private set; 
        public string Manufracturer  get; private set; 
        public string Name  get; private set; 
        public static string OSName  get; set; 

        private DeviceInfo()
        
            Id = GetId();
            var deviceInformation = new EasClientDeviceInformation();
            Model = deviceInformation.SystemProductName;
            Manufracturer = deviceInformation.SystemManufacturer;
            Name = deviceInformation.FriendlyName;
            OSName = deviceInformation.OperatingSystem;
        

        private static string GetId()
        
            if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.System.Profile.HardwareIdentification"))
            
                var token = HardwareIdentification.GetPackageSpecificToken(null);
                var hardwareId = token.Id;
                var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);

                byte[] bytes = new byte[hardwareId.Length];
                dataReader.ReadBytes(bytes);

                return BitConverter.ToString(bytes).Replace("-", "");
            

            throw new Exception("NO API FOR DEVICE ID PRESENT!");
        
    

【讨论】:

任何想法如果...如果您要构建针对手机和桌面上使用的 UWP 的应用程序或库 - 您可以同时使用手机和桌面 SDK 还是会导致构建、运行时出现任何问题还是认证? 如果您将 RAM 添加到您的 PC,硬件令牌可以更改,对吧? @Grigory 我相信是的,我记得我在 msdn 上看到过一些东西,比如在生成令牌时会考虑 cpu id 和 Ram 大小。 @El 我正在为同一设备获取不同的硬件 ID @KinjanBhavsar 对于多个应用程序,这是我建议的预期行为。你在说什么背景?【参考方案5】:

好像

var deviceInformation = new EasClientDeviceInformation();
string Id = deviceInformation.Id.ToString();

正在发挥作用,引用 EasClientDeviceInformation 它提供了一个唯一的 ID。

Id 属性表示使用从 MachineID、用户 SID 和包系列名称的 SHA256 哈希的前 16 个字节截断的 GUID 的 DeviceId,其中 MachineID 使用本地用户组的 SID。

但它仅适用于 Windows 应用商店应用程序...所以必须有另一种解决方案。

【讨论】:

EasClient ID 不是正确的解决方案。它也不适用于所有设备系列,因此您需要参考扩展 SDK。 嗨@EI Marchewko,EasClientDeviceInformation 是否适用于 windows phone 10?

以上是关于如何在 Windows 10 Universal 中获取设备的唯一标识符?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows 10 Universal中获取设备的唯一标识符?

如何检查 Windows Universal 10 应用程序是不是已关闭而不是最小化?

在Windows 10 Universal App上添加Youtube嵌入视频

当应用程序不在前台时,如何在 Windows Universal 中获得正确的时间间隔?

iOS 和 Universal WINdows App 中的屏幕密度

Windows Universal App 维护开放的 WebSocket