質問

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
役に立ちましたか?

解決

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

Windows から SMBIOS 情報をクエリするには、次のコマンドを使用できます。 EnumSystemFirmwareEntries, EnumSystemFirmwareTables そして GetSystemFirmwareTable.

IIRC、CPUID 命令の「固有 ID」は、P3 以降では非推奨になりました。

他のヒント

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

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

私たち ライセンスツール 次のコンポーネントを考慮します

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

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

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

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

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

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

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

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

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

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

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

LDAP 経由でドメイン マシン アカウント SID にアクセスするか、 System.DirectoryServices.

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

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

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

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

少しズルかもしれませんが、最近ではマザーボードを変更せずにマシンのイーサネット アダプタの MAC アドレスが変更されることはほとんどありません。

メーカーのシリアル番号やサービスタグなどを入手していただけますか?

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

追加の制約がありました。.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 つのオプションについて CPUID を検索します。マルチ CPU システムでは問題が発生する可能性があります。

これを試してみると、一意のハードディスク ID が得られます。 Delphi 7-2010 の DiskId32 のポート.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top