一意のマシンIDを生成する


104

Windows OSを実行している特定のマシンに固有のIDを生成する関数を作成する必要があります。

現在、WMIを使用してさまざまなハードウェアパラメーターを照会し、それらを連結してハッシュして、一意のIDを導出しています。私の質問は、使用すべき推奨パラメーターは何ですか?現在、bios \ cpu \ diskデータの組み合わせを使用して一意のIDを生成しています。また、各メトリックに複数の結果がある場合は、最初の結果を使用しています。

しかし、2つの異なるWindows OSでデュアルブートするマシンが各OSで異なるサイトコードを生成するという問題に遭遇しました。

参考までに、私が現在使用している指標は次のとおりです。

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

回答:


25

SMBIOSを自分で解析し、任意の長さにハッシュします。使用可能なすべてのSMBIOS構造については、PDF仕様を参照してください。

WindowsからSMBIOS情報を照会するにはEnumSystemFirmwareEntriesEnumSystemFirmwareTablesおよびを使用できますGetSystemFirmwareTable

IIRC、CPUID命令からの「一意のID」はP3以降では非推奨です。


14
これらの機能には、少なくともWindows Vista、Windows XP Professional x64 Edition、Windows Server 2008、またはWindows Server 2003 SP1が必要です。
jcoffland 2011年

33
GetSystemFirmwareTable( 'RSMB' ...);を呼び出すことでした。SMBIOSTableDataバッファ全体をハッシュします。CPUの内部温度をそのテーブルに書き込むワークステーションに遭遇するまで、それはうまくいきました。つまり、私の固有のIDは数秒ごとに変更されました。
Thomas

このソリューションで使用できるソースコードはありますか?
Just Shadow

@トーマス、それであなたは最終的にどの解決策を選びましたか?
Smith

@スミス私の目標は小さな8文字のIDでした。仕様を読んで、どのフィールドが異なるかを決定し、それらを除外しました。その後、長年にわたって、マシンからの定数ではないフィールドをさらに削除しました。最後に、入力として使用した生データの暗号化されたコピーを保存するcloseEnoughことになり、2つのフィールドのみが異なる場合に一致しないIDを受け入れるように関数を作成しました。プロセッサとシステムのハードドライブに関する詳細もハッシュに含めています。これは、早い段階で同一のシステム間で衝突が発生したためです。
トーマス

72

私は同じ問題を抱えていたので、少し調査した結果、@ Agnusが示唆したように、MachineGuidレジストリキーを読み取るのが最善だHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptographyと判断しました。OSのインストール中に生成され、別のOSを新たにインストールしない限り変更されません。OSのバージョンに応じて、ネットワークアダプターのMACアドレスが埋め込まれている(さらに、ランダムを含む他のいくつかの番号が含まれている)か、疑似乱数が含まれている可能性があります。理論的には疑似ランダムである場合、それは偽造される可能性があります-2つのマシンがリアルタイムクロックを含む同じ初期状態を持っている場合。実際にはこれはまれですが、ハードコアのハッカーによって攻撃される可能性のあるセキュリティのベースになると予想する場合は注意してください。

もちろん、レジストリエントリは誰でも簡単に変更してマシンのGUIDを偽造することもできますが、これにより、Windowsの多くのコンポーネントの通常の操作が中断され、ほとんどの場合、通常のユーザーはそれを実行できなくなります(ここでも注意してください)。ハードコアハッカー向け)。


6
KEY_WOW64_64KEYフラグを使用して、レジストリキーの「実際の」バージョンを常に取得できることを確認できます。
コレン

13
ドライブイメージのクローンを作成する場合、これは同じままです。したがって、これは改ざんに対して安全ではなく、非常に危険です。
bitbonk

19
ポイントを明確にするために、私がソフトウェアにDRM対策を導入するとき、私の主な目標は、「プロ」の海賊が無制限にソフトウェアの違法コピーを販売することを可能にする亀裂を作成することを防ぐことです。私のソフトウェアを使用できるようにするためだけに、彼の友人のドライブを複製する偶然のハッカーについてはそれほど心配していません。そのような場合、それらの人々は通常お金よりも多くの時間を持っており、とにかくそれのためにお金を払っていないでしょう。ソフトウェアの価格が$ 100で、賃金が$ 50 / hを超える場合は、その費用を支払うだけです。手間のかかる時間は2時間以上です。
Fabio Ceconello、2011

7
特に、マスターマシンイメージのクローンを作成してWindowsをインストールする環境では、MachineGuidはすべてのマシンで同一になります。
nandhp

8
sysprep&allを使用して、それを合法的に正しく行う場合は、できません。Windowsの海賊版コピーを持ち、「クローンするだけ」の場合、それは別の問題です。とにかく、彼らはそんなに簡単に止められないでしょう。
Fabio Ceconello、2012年

34

当社とのライセンスツール我々は、以下のコンポーネントを検討します

  • Macアドレス
  • CPU(シリアル番号ではなく、ステッピングやモデルなどの実際のCPUプロファイル)
  • システムドライブのシリアル番号(ボリュームラベルではない)
  • 記憶
  • CD-ROMモデルとベンダー
  • ビデオカードモデルとベンダー
  • IDEコントローラ
  • SCSIコントローラ

ただし、コンポーネントをハッシュして合否システムを作成するだけでなく、比較可能なフィンガープリントを作成して、2つのマシンプロファイルの違いを判断することができます。差分評価が指定された許容範囲を超えている場合は、ユーザーに再度アクティブ化するように依頼します。

過去8年間に何十万ものエンドユーザーインストールで使用されており、この組み合わせは、仮想マシンや複製されたOSインストールであっても、確実に一意のマシンIDを提供するのに効果的であることがわかりました。


1
使用するMACアドレスをどのように決定しますか?マシンは複数のNICを持つことができ、これらは動的に追加されます(アプレットを介して新しいVPNに接続すると、仮想NICが追加されます)。一部は仮想であり、タイプがイーサネットであり、仮想として識別するのが困難です。その他は、ネットワークの状態に応じてアップ/ダウンします(wifi)
Marek

仮想NIC、blue-toothなどを除くすべての物理NICを使用します。これらをすべて組み合わせて、統一ハッシュを作成します。
ポールアレクサンダー

CPUシリアル番号を使用しないことを推奨する理由
Mojtaba Rezaeian 2016

3
CPUシリアル番号は、何年もの間Intelチップで有効にされていません。システムコールはまだ存在しますが、安定した値を返しません。私はそれが何を返すのか思い出せません-ダミーデータまたはすべてのマシンで同じ値のどちらか。どちらにしても、信頼できるハードウェアメトリックではありません。
ポールアレクサンダー

1
@PaulAlexanderあなたが参照したツールは、あなたが言及したすべてのパラメータを検証しますか、それともいくつかは機能しますか?現在、システムは通常、CD-ROMで構成されていないため
FaizanHussainRabbani

3

プロセッサのUniqueIDを使用するだけではどうですか?


14
最近は減価償却物件ではないですか?
ジェイクウィルソン

15
おそらく彼は「廃止予定」を意味します... CPUメーカーは一意のIDを1つの段階で導入し始めましたが、プライバシー問題への反発のために、彼らは再び立ち止まりました。そのため、一部には一意のIDがありますが、ほとんどの最近のCPUにはありません。
TripleAntigen 2011

1
参考までに、Pentium IIIのほんの短いバッチのみが、読み取り可能なCPUシリアル番号を持っていました。新しいバージョンにはシリアル番号がありましたが、デフォルトでは無効にされていました。Pentium IV以降のCPUではまったくサポートされていません。
ポールアレクサンダー

2

私は「あなたはただそれを間違っている」と言っている男であるのが嫌いです(私はいつもその男が嫌いです;)しかし...

固有のマシンに対して繰り返し生成する必要がありますか?識別子を割り当てるか、公開鍵/秘密鍵を使用できますか?値を生成して保存できれば、同じディスク上の両方のOSインストールからアクセスできるでしょうか。

あなたはおそらくこれらのオプションを検討したことがあり、それらはあなたのために機能しませんが、そうでなければ、それは考慮すべきことです。

ユーザーの信頼の問題ではない場合は、MACアドレスを使用できます。


5
マシンにネットワークカードがない場合、MACアドレスは機能しません。
ブライアン

7
@ブライアン-ネットワークカードを持たないコンピュータを識別するために、一意の値が本当に必要ですか?マシンがカードを持っているのはかなり安全なことのようです。
romandas 2009年

1

ネットワークカード(存在する場合)のMACアドレスを使用して調べる必要があります。それらは通常ユニークですが、製作することができます。私は、ネットワークアダプターのMACアドレスに基づいてライセンスファイルを生成するソフトウェアを使用したので、コンピューターを区別するためのかなり信頼できる方法と考えられています。


6
いいえ、そうではありません。多くのメーカーがそれらを変更することができます。一部のベンダーが同じMACアドレスを持つすべてのコンピューターを提供しているため、これはクラスターを操作するときに非常に役立ちます(数年前にこの問題に遭遇しました)。
ギズモ

tはオフラインなりすまし-proodnessかを指定-あなたはgeneralyあなたがネットワークで特定したい場合はユニークなIDを生成したい|これは質問がない、多くの場合、有効なアイデアです
Hurda

同じマシンに複数のネットワークデバイスを含めることができます。それらが常に同じ順序で検出されることや、ある時点で置き換えられないことは保証されません。より永続的であると思われるハードウェアを使用することをお勧めします。
Agi Hammerthief 2017年

1

私のアプリケーションの1つでは、ドメイン名以外のコンピューターの場合はコンピューター名を使用するか、ドメインコンピューターのドメインマシンアカウントSIDを使用します。Mark Russinovichがこのブログ記事Machine SIDでそれについて語っています:

SIDの重複が問題になる最後のケースは、分散アプリケーションがマシンSIDを使用してコンピューターを一意に識別する場合です。すべてのDCが同じマシンSIDを持っているという事実だけでは、Microsoftソフトウェアはそのようにせず、マシンSIDをそのように使用しても機能しません。一意のコンピューターIDに依存するソフトウェアは、コンピューター名またはコンピュータードメインSID(ドメイン内のコンピューターアカウントのSID)を使用します。

ドメインマシンアカウントのSIDには、LDAPまたはを介してアクセスできますSystem.DirectoryServices


1

私のプログラムでは、まずターミナルサーバーを確認し、WTSClientHardwareIdを使用します。それ以外の場合は、ローカルPCのMACアドレスで十分です。

提供したプロパティのリストを本当に使用したい場合は、OSに依存している可能性があるため、Nameand 、、などのようなものは除外してください。両方のオペレーティングシステムで同じ情報を出力してみて、異なるものは除外してください。DriverVersionClockspeed


1

ハードウェア固有の情報を取得するために利用可能なライブラリがあります:ハードウェアシリアル番号抽出(CPU、RAM、HDD、BIOS)


2
クローズドソースの商用ライブラリです。
2014

@Gab-ソースコードが利用可能です。そして、DLL(29)の価格は、2000ドルに近い他のライブラリと比較しても何もありません。だから、はい、それは仕事をします。
InTheNameOfScience 2015

0

ネットワークカードのMACアドレスを使用しませんか?


14
Macアドレスが偽装される可能性
Henry B

これは、多くの場合、有効なアイデアで、問題はない| tはなりすまし-proodnessまたはオフラインを指定-あなたはgeneralyあなたがネットワークで特定したい場合はユニークなIDを生成したい
Hurda

0

少し浮気しているかもしれませんが、マシンのイーサネットアダプタのMACアドレスは、マザーボードが最近変更されない限り、めったに変更されません。


多くのメーカーがそれらを変更することができます。一部のベンダーが同じMACアドレスを持つすべてのコンピューターを提供するため、これはクラスターを操作するときに非常に役立ちます(数年前にこの問題に遭遇しました)。
ギズモ

1
MACは非常に簡単に変更できるため、完全に信頼できません(グーグル検索にすると、これを実行している無料のツールがたくさん表示されます)。WMIについても同様です。
InTheNameOfScience 2015

0

製造元のシリアル番号やサービスタグの一部を引き出すことはできますか?

当店はデルの店ですので、各マシンに固有のサービスタグで識別しています。少なくともLinuxでは、BIOSから照会できることはわかっていますが、Windowsでそれを行う方法がわかりません。


0

追加の制約があり、.net Expressを使用していたため、標準のハードウェアクエリメカニズムを使用できませんでした。そこで、Power Shellを使用してクエリを実行することにしました。完全なコードは次のようになります。

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

-1

1つのオプションについてCPUIDを検索します。マルチCPUシステムには問題がある可能性があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.