質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2681閲覧

システム詳細情報の「デバイスID」の取得方法が知りたい

OlivePopeye.net

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2024/02/29 04:15

実現したいこと

該当するPCを示す一意となる情報を調べていたところ、システムの詳細情報にある【デバイスID】が、OS更新等を行っても変わらないとあったため、このデバイスID情報を確認することで、該当PCを特定できるようにしたい。
※MACアドレスもあるが、該当PCに複数NICが接続されている場合、マザーボードにOnBoardしているNICの抽出方法がわからなかったため、このデバイスIDを参照したいです。

発生している問題・分からないこと

C#(.NET Framework) にて、システム - 詳細情報 - デバイスの仕様 に記載されている【デバイスID】を取得する方法がわからない。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

WMIで取得出来るのでは?と調べては見たのですが、見つけきれず。。。。
(プロダクトIDは、 Win32_OperatingSystem で取得はできたのですが、デバイスIDは見つからず)

補足

イメージ説明

juner👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

poto568

2024/02/29 04:38

個体識別に当該デバイスIDが妥当かどうかはわかりませんが、 とりあえずそのデバイスIDの文字列をレジストリで検索すると いろいろ引っかかるので、使いやすそうな所から拾ってこれそうな 気がします。 私はC#を知らないので、直接参照できる関数とかの情報については 有識者の回答を期待して下さい。
OlivePopeye.net

2024/02/29 07:49

回答ありがとうございます! 僕の方でもレジストリ検索をして、同じ文字列が存在することが確認できました。 こういう情報もレジストリに書かれるんですね。。。勉強になりました!
guest

回答2

0

C#(.NET Framework) にて、システム - 詳細情報 - デバイスの仕様 に記載されている【デバイスID】を取得する方法

(ほかに手もあるかもしれませんが)レジストリを見るのが手っ取り早そうです。
HKLM\SOFTWARE\Microsoft\SQMClient\MachineID
Where do Windows "Product ID" and "Device ID" values come from? Are they useful for Licensing/Identification? How can they be accessed in code? - Stack Overflow

該当するPCを示す一意となる情報

上記リンクのコメント内でレイモンドは、こっちがいいと言っているようです(わたしは使ったことがないので詳細は知りません)
SystemIdentification.GetSystemIdForPublisher メソッド (Windows.System.Profile) - Windows UWP applications | Microsoft Learn

How can I get a signature for a Windows system that will remain unchanged even if the user reinstalls Windows? - The Old New Thing

(WinRTなので).NET Frameworkから使うのはひと手間かかりますが...
デスクトップ アプリで Windows ランタイム API を呼び出す - Windows apps | Microsoft Learn

cs

1using System; 2using Microsoft.Win32; 3using Windows.Security.Cryptography; 4using Windows.System.Profile; 5 6 7namespace Qlkri23xcv2bvdb 8{ 9 class Program 10 { 11 static void Main() 12 { 13 var view = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; 14 using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view)) 15 using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\SQMClient")) 16 { 17 var machineId = key.GetValue("MachineID")?.ToString() ?? "not found."; 18 Console.WriteLine(machineId.Trim('{', '}')); 19 } 20 21 22 // [How can I get a signature for a Windows system that will remain unchanged even if the user reinstalls Windows? - The Old New Thing](https://devblogs.microsoft.com/oldnewthing/20180131-00/?p=97945) 23 var buffer = SystemIdentification.GetSystemIdForPublisher(); 24 var id = buffer.Id; 25 var asHex = CryptographicBuffer.EncodeToHexString(id); 26 Console.WriteLine(asHex); 27 var asBase64 = CryptographicBuffer.EncodeToBase64String(id); 28 Console.WriteLine(asBase64); 29 30 Console.ReadKey(); 31 } 32 } 33}

NuGet Gallery | Microsoft.Windows.SDK.Contracts 10.0.19041.2

投稿2024/02/29 09:03

TN8001

総合スコア10022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2024/02/29 09:03

解決済みですが...参考情報
guest

0

ベストアンサー

多分言っている デバイスID は

マイクロソフトでは品質管理のため、
“Specifies the Software Quality Metrics (SQM) Client-to-Service Protocol V2” というプロトコルを使い、各 Windows のテレメトリー情報を取得しています。
“SQMClient MachineID” は SQM による品質管理の通信のために各デバイスを識別するために使われる ID となり、以下のレジストリ キーに情報が格納されています。


レジストリ パス : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQMClient
名前 : MachineId
型 : REG_SZ
値 : <ランダムなID が生成>

■ SQMClient MachineID とは -マスター イメージ展開後に複数端末で同じ SQMClient MachineID が使用されてしまう事象について | Microsoft Japan Windows Technology Support Blog

にある様に MachineId ではないでしょうか?

取得方法としては pwsh なら

pwsh

1Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\SQMClient" -Name "MachineId"

C# なら

csharp

1using Microsoft.Win32; 2using System.Runtime.InteropServices; 3if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 4 throw new PlatformNotSupportedException("required windows only"); 5using var subKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\SQMClient"); 6if (subKey is not { } _subKey || _subKey.GetValue("MachineId") is not string _machineId) 7 throw new Exception("not found registry key \"SOFTWARE\\Microsoft\\SQMClient\\MachineId\""); 8// _machineId はこの時点で string 9// Guid 化 10var machineId = Guid.Parse(_machineId); 11// 大文字で出力したいならこう 12Console.WriteLine($"{machineId:B}".ToUpperInvariant());

で取れます。

以上。

投稿2024/02/29 06:44

編集2024/02/29 07:06
juner

総合スコア754

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OlivePopeye.net

2024/02/29 07:48

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
OlivePopeye.net

2024/02/29 07:51

#すみません。定形のままコメント出してしまいました。。。 回答ありがとうございました! 先程こちらでもレジストリを確認して、システムに表示されているものと同じIDが取得出来ました。 コード記載もありがとうございます。試してみますね。 協力ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問