如何在 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 中获得正确的时间间隔?