web-dev-qa-db-ja.com

Windows 10 Universal内でデバイスの一意の識別子を取得するにはどうすればよいですか?

これは、Windows Universal 8.1の一意のDeviceIDを取得するための古い実装ですが、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("-", "");
    }
20
Jens Marchewka

これがWindowsデスクトップの完全なソリューションです。

  • 拡張機能の参照「Peter Torr-MSFTに言及したUWP用のWindowsデスクトップ拡張機能」を追加します。

このコードを使用して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!");
        }
    }
}
18
Jens Marchewka

のようだ

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

EasClientDeviceInformation を参照して、ユニークなIDを提供します。

Idプロパティは、MachineID、ユーザーSID、およびMachineIDがローカルユーザーグループのSIDを使用するパッケージファミリ名のSHA256ハッシュの最初の16バイトから切り捨てられたGUIDを使用してDeviceIdを表します。

ただし、Windowsストアアプリでのみ機能します...そのため、別の解決策が必要です。

8
Jens Marchewka

Windows 1609の更新(「記念日更新」)

IDを取得するはるかに良い方法については、 this Q&A を参照してください。

古いOSビルドの古い情報

ハードウェアトークンに対してビルドするには、デスクトップおよび/またはモバイルSDKへの参照を追加する必要があります。実行時にApiInformation型を使用して、使用する前にAPIが存在するかどうかを照会する必要があります(Xboxなどの他のデバイスファミリにはありません)。

そうは言っても、人々が実際には問題の最善の解決策ではないデバイスIDを要求する場合、所有権が変更されても、寿命全体にわたって物理デバイスを特定する必要がありますか?

8

EasClientDeviceInformationは、Windows 10モバイルでは機能しません。デバイスIDは、すべての電話で同じです(win10mのすべての顧客は同じGUIDで登録されます)。正しい電話にプッシュメッセージを送信するには、IDが必要です。

1
tobjak75
//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);
        }
0
user4773407