107

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
4

15 に答える 15

75

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

もちろん、レジストリ エントリは誰でも簡単に変更してマシンの GUID を偽造することができますが、私が見つけたのは、これにより Windows の非常に多くのコンポーネントの通常の動作が中断されるため、ほとんどの場合、通常のユーザーがそれを行うことはありません (繰り返しますが、注意してください)。筋金入りのハッカー向け)。

于 2009-05-04T15:18:52.640 に答える
37

ライセンスツールでは、次のコンポーネントを検討します

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

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

過去8年間、数十万のエンドユーザーインストールで使用されていることから、この組み合わせは、仮想マシンやクローンOSのインストールでも、確実に一意のマシンIDを提供するためにうまく機能することがわかりました。

于 2012-03-07T21:46:52.443 に答える
26

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

EnumSystemFirmwareEntriesWindows から SMBIOS 情報を照会するには、EnumSystemFirmwareTablesとを使用できますGetSystemFirmwareTable

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

于 2008-09-22T13:48:52.980 に答える
3

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

于 2008-09-19T05:32:30.557 に答える
1

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

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

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

于 2011-03-31T16:04:54.660 に答える
1

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

于 2008-09-19T05:32:01.617 に答える
1

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

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

おそらくこれらのオプションを調べたことがありますが、うまくいきませんが、そうでない場合は、検討する必要があります。

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

于 2008-09-19T05:36:45.927 に答える
1

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

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

于 2008-11-14T11:12:57.627 に答える
0

ネットワーク カードの MAC アドレスを使用しないのはなぜですか?

于 2008-09-19T05:35:37.427 に答える
0

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

于 2008-09-19T05:36:16.863 に答える
0

製造元のシリアル番号またはサービス タグを取得できますか?

当店はデルのショップなので、各マシンに固有のサービス タグを使用してマシンを識別しています。少なくとも Linux では、BIOS からクエリを実行できることは知っていますが、Windows で直接行う方法はわかりません。

于 2008-09-19T05:36:54.053 に答える
-1

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

于 2008-09-19T05:35:14.463 に答える