ライセンスサーバーを実装する必要がある間、ソフトウェアが実行されているサーバーを特定のホスト ID で一意に識別するという問題に直面しています。サーバーは、任意の Windows または Linux にすることができます。仮想マシンも可能です。ネットワーク カードの MAC アドレスを使用すると、ホスト ID を変更せずに仮想マシンをコピーできます。
ホストIDを計算する方法はありますか? できれば Java で実行可能です。
ライセンスサーバーを実装する必要がある間、ソフトウェアが実行されているサーバーを特定のホスト ID で一意に識別するという問題に直面しています。サーバーは、任意の Windows または Linux にすることができます。仮想マシンも可能です。ネットワーク カードの MAC アドレスを使用すると、ホスト ID を変更せずに仮想マシンをコピーできます。
ホストIDを計算する方法はありますか? できれば Java で実行可能です。
これを一度行う必要があり、最終的に SMBios 内で UUID を使用することになりました。
私の場合、Java ではなく UNIX 環境で C を使用しましたが、SMBios仕様を読むことに興味があるかもしれません。UUID を読んでみてください。これは、MAC やハードディスクのシリアル番号を読み取るよりも少し優れているはずです。など、ユーザーは BIOS より頻繁にこれらを交換する可能性があるためです。
編集: コメントで議論した内容を追加するために更新しました (すべてを同じ場所にまとめるためだけに)。
仮想マシン (VMWare) では、UUID は物理マシンの UUID と vm が「存在する」場所へのパスから生成されます (参照: http://www.vmware.com/support/ws55/doc/ ws_move_uuid_format.html )
Javaの場合、メモリの読み取りと書き込みを可能にするjavax.realtime.RawMemoryAccessがあることを私は知っています。私は実際にそれを試したことはありませんが、Java から実行する正しい方法のようです (誰かがこれについて何か経験を持っている場合はコメントしてください!)
それ以外の場合は、それほど移植性のないソリューションがあります: JNI、つまり C++ です。前に述べたように、私の唯一の経験は UNIX システムでした。私の特定のケースでは、dmidecodeのソースが非常に役に立ちました。Windows の場合は、このSO questionを試すことができます。これは役立つ場合があります。
はい、最初は調査が大変に思えるかもしれません:) しかし、仕様を読み、(必要に応じて) dmidecode のソースを見ると、それを実行できるはずであり、(私の経験では) ) ディスクやネットワーク カードからシリアル番号をハッシュするよりも、「現場で」より良い結果が得られます。
残念ながら、SMBIOS UUID はすべてのシステムで一意というわけではありません。そうあるべきですが、そうではありません。
これは、SMBIOS UUID の仕様に問題があるためではなく、多くのメーカーがこの UUID を作成する際に仕様に従っていないためです。
これが実際にどのようにうまくいかないかについての詳細は、インテルのブログhttp://software.intel.com/en-us/blogs/2007/06/08/are-uuids-enterprise-worthyを参照してください。現実世界の本当にひどい例: http://howtowriteaprogram.blogspot.nl/2012/06/smbios-uuid-fail.html .
ところで、一意のマシン ID の生成には、マシンの一意の ID の作成に関するスタックオーバーフローに関する別のより有益なトピックがあります。
MAC アドレスは比較的スプーフィングしやすいため、MAC アドレスはこれを行う最善の方法ではない可能性があります。Java 5 以降、一意の ID を作成するために使用できる UUID クラスがありました。私はあなたが何のために撮影しているのかわからないので、それがあなたが探しているものであることを願っています.