2012-05-31 30 views
4

雖然必須實施許可證服務器,但我面臨的問題是,通過某些主機ID來識別唯一運行軟件的服務器。服務器可以是任何Windows或Linux。另外虛擬機也是可能的。查找網卡的MAC地址將允許在不更改主機ID的情況下複製虛擬機。計算許可證管理的唯一主機ID?

任何想法如何計算主機ID?最適用於Java。

+0

創造機器唯一的ID的虛擬機的MAC地址通常會發生變化時,它被複制,爲避免衝突,如果兩個虛擬機同時運行計算器另一個更翔實的話題。但是,如果您擔心用戶故意嘗試進行完全重複,則沒有真正可靠的方法來區分一臺虛擬機。甚至可以修改BIOS UUID。 – Wyzard

+0

這就是我猜到的。因此,最終VM原理會殺死每個許可證管理嘗試執行主機限制... – micgn

回答

0

MAC地址可能不是最好的辦法,因爲MAC地址相對容易被欺騙。從Java 5開始,就有了可以用來創建唯一標識的UUID類。我不確定你在拍什麼,所以我希望這就是你要找的。

1

我不得不這樣做一次,最後在SMBios中使用UUID。

在我的情況下,我在unix環境中使用C,而不是Java,但是您可能有興趣閱讀SMBios規範,並在閱讀UUID時嘗試一下,它應該比讀取MAC更好一點磁盤序列號等,因爲用戶可能比bios更經常替換這些。

編輯:已更新,以添加我們在評論中討論過的內容(僅將所有內容放在同一位置)。

在虛擬機(VMware,這是),從物理機的UUID和路徑到VM「住」產生的UUID(見: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的來源,你應該能夠做到,並且會(以我的經驗)在「現場」產生比散列來自磁盤或網卡的序列號更好的結果。

+0

虛擬機中的情況如何?當虛擬機從一臺服務器複製到另一臺服務器時,虛擬機是否有自己的Bios UUID保持不變?這將是一個服務器主機準確的許可證不幸... – micgn

+0

我假設你在這裏談論vmware。每個虛擬機都有自己的uuid,基於物理機器的uuid和vm所在的路徑。請參閱:http://www.vmware.com/support/ws55/doc/ws_move_uuid_format.html – marcelog

+0

感謝您的提示!我怎樣才能訪問它?用VBS?我在這裏找到了這個:http://www.rgagnon.com/javadetails/java-0580.html – micgn

0

不幸的是,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

順便問一下有關於在Generating a unique machine id