Delphi でマシンの一意のシリアル番号を生成する方法について質問がありますか? マザーボードまたはプロセッサの ID を使用してこれを実行しようとしましたが、残念ながらサポートされていません。パーティションの通し番号などは、フォーマット後に変更されるため、落ちます。フォーマットしても変わらないものを探しています。誰にもアイデアはありますか?
7 に答える
JCLライブラリ内には、このトピックに非常に役立つ関数がいくつかあります。
function CPUID: TCpuInfo;
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
function GetVolumeSerialNumber(const Drive: string): string;
function GetBIOSName: string;
あなたが求めているのは、実際には「シリアル番号」ではなく、ある種の「ハードウェア指紋」です。このアプローチの問題は、100% 信頼できないことです。証拠: Microsoft は、OEM ソフトウェアを任意の 1 台のコンピューターに適切に制限する方法を見つけることができませんでした。実際には、しばらくすると新しいコンピューターに OEM ライセンスを再インストールできます! 完璧な解決策はあり得ないことに同意したら、オプションを検討して、十分に優れたものを取得してみてください。
私のアプリケーションでは、GetSystemInfo、GetVolumeInformation、および ('C:' パーティションの場合) によって返された情報と、HKLM\HARDWARE からのレジストリ キーの選択 (実際には多くのレジストリ キー、usb、キーボード、およびマウスのもの)。Windows アプリケーションは実際にはハードウェアに直接アクセスできない (DOS スタイルのアプローチは機能しない) ため、レジストリからハードウェア情報を読み取っています。多くの異なるデバイス。
私のアプローチには次の欠点があります。
- Format で設定されたパーティションのシリアル番号を使用します。フォーマットによってフィンガープリントが明らかに変更されます。
- インストールされているドライバーに関する情報を使用します。ドライバーを更新すると、実際にはフィンガープリントが変更される場合があります。カードを 1 つの PCI ポートから別のポートに移動すると、フィンガープリントが変更される場合があります。
それでもなお、この変化するすべての情報を考慮に入れても、衝突が発生します。1/1000 コンピューターのようなものです! ここでは、いくつかの要因が働いています。
- 大手 OEM は、同じハードウェアを使用して多くのコンピューターを構築します。また、ソフトウェアのインストールを高速化するために HDD のクローンを作成し、異なる PC が同じパーティションのシリアル番号を取得できるようにします。
- 私はそのすべての情報から非常に短いハッシュを作成しています。これは、人々が電話でそれを読んでもあまり間違いなく読めるように十分に短いものです。
このシステムは私には機能しますが、再インストール後にコンピューターを再識別しようとする場合には機能しません。
Windows でいくつかのコンポーネントの情報を抽出するGLibWMIをテストできます。
無料で、ソースが含まれています。私の WebまたはSourceforgeで見つけることができます。
代替テキスト http://img175.imageshack.us/img175/1250/imagen344.png
BIOSInfo、DiskInfo、ProcessorInfo などのコンポーネントを含めます。
この 3 つのコンポーネントを使用すると、次のような情報を取得できます。
代替テキスト http://img690.imageshack.us/img690/6006/imagen349.png
GenericDemo (すべてのコンポーネント) の BIN/EXE はここにあります。このコンポーネントで取得できるすべての情報をテストできます。
ここに簡単な解決策があります
- GUID を生成する
- Guid 値をレジストリに保存します。
GUID の値をシリアル番号として使用する
セキュリティが心配な場合は、( Guid + 一部の秘密データ) に対してハッシュを使用します。
古き良きDOS時代にも同様の問題がありました。インストールされているハードウェアの ROM であることがわかりました。ビデオ カード、ディスク コントローラーのシリアル ポートなどは、メモリ マップされているため、直接アクセスできました。これは、インストールされているハードウェアのリストを作成し、それを使用して各コンピューターを一意に識別する「シリアル番号」を生成できたことを意味します (ハードウェアのセットアップが変更されるまで)。今日も同様のことが可能であると確信しています。
このアプローチを使用する場合は、http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-mapを確認してください。
よろしく
- フランク
多くの場合、(a) ネットワーク カードの MAC アドレスが使用されます。(Delphi で) MAC アドレスを照会する方法はいくつかありますが、最も簡単でクリーンな方法は、おそらくGetAdaptersInfo API を使用することです。
私は「それはできない」陣営に同意する傾向があります。少なくとも 100% ではありませんが、平均的なユーザーを維持するのに「十分」である可能性があります。
そして、それができるなら、それはおそらく完了しています。Torry の Delpi300 などを確認しましたか (Delphi に変換する必要があるかもしれませんが、sourceforge でさえも可能です)。