8

C#で記述されたMetroアプリに取り組んでおり、デバイスを一意に識別する方法が必要です。見栄えのするドキュメントでASHWIDを見つけました。提案されたコードは次のとおりです。

HardwareToken token = HardwareIdentification.GetPackageSpecificToken(null);
IBuffer hardwareId = token.Id;
IBuffer signature = token.Signature;
IBuffer certificate = token.Certificate;

問題は、そのIBufferを使用できる文字列に変換するにはどうすればよいですか?

4

4 に答える 4

15

実際にJSまたはC++にあった提案を何度も調べた後、私はついに答えを見つけました!

private string GetHardwareId()  
{  
    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);  
}  

このブログに感謝します-http://bartwullems.blogspot.co.uk/2012/09/windows-8-uniquely-identifying-device.html

于 2012-09-21T09:50:37.940 に答える
4

これも機能するはずですが、テストするWindows8がありません...

private string GetHardwareId()   
{ 
  return BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray());
}

そして、それを複数回呼び出す場合は、Lazy<T>

private static Lazy<string> _hardwareId = new Lazy<string>(() => BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray()), true);

public string HardwareId()   
{ 
     return _hardwareId.Value;
}

または、常に呼び出されることがわかっている場合は、静的にします。

public static readonly string HardwareId = BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray()));
于 2012-09-21T10:02:03.560 に答える
3

使用できます。http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspxHardwareIdentification.GetPackageSpecificToken(null)を参照してください。

この関数は、必要に応じてフィルタリングできる多くの情報を提供します。例えば:

public static string GetMachineId()
{
    var hardwareToken = 
        HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray();
    var count = hardwareToken.Length / 4;
    ulong id = 0ul;
    for (int i = 0; i < count; i++)
    {
        switch (BitConverter.ToUInt16(hardwareToken, i * 4))
        {
            case 1:
                // processor
            case 2:
                // memory
            case 9:
                // system BIOS
                id = (id << 12) ^ BitConverter.ToUInt16(hardwareToken, i * 4 + 2);
                break;
        }
    }
    return Convert.ToBase64String(BitConverter.GetBytes(id));
}

ただし、この関数と基盤となるAPIは、インターネットに接続されているすべてのマシン間で絶対的な一意性を保証することはできないことに注意してください。通常、これをユーザーに関する情報と組み合わせます。

もう1つのオプションは、GUIDを生成してローカル(非ローミング)ストレージに格納し、それをマシンIDとして使用することです。正確なニーズによっては、これがより良い解決策になる場合があります。

于 2014-09-30T08:38:07.147 に答える
0

GUID IDの場合、上記の回答の拡張として次のことを行うことができます

    private Guid GetHardwareId()
    {
        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);  

        byte[] deviceId = new byte[16];
        Array.Copy((byte[])bytes, deviceId, deviceId.Length);

        return new Guid(deviceId);
    }
于 2015-02-06T08:12:17.500 に答える