【问题标题】:How do I get a Unique Identifier for a Device within Windows 10 Universal?如何在 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 实际出现在哪里。

标签: c# windows-runtime windows-10 win-universal-app


【解决方案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?
    猜你喜欢
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2022-09-29
    • 2017-03-16
    相关资源
    最近更新 更多