2008-09-19 157 views
92

我需要編寫一個函數來生成一個對於運行Windows操作系統的機器來說唯一的ID。生成一個唯一的機器ID

目前,我正在使用WMI來查詢各種硬件參數並將它們連接在一起並對它們進行散列以導出唯一的ID。我的問題是,我應該使用什麼建議的參數? 目前,我正在使用bios \ cpu \ disk數據的組合來生成唯一的ID。如果每個指標都有多個結果,那麼我會使用第一個結果。

但是,我遇到了一個問題,雙啓動到2個不同的Windows操作系統的計算機在每個操作系統上生成不同的站點代碼,這應該不會發生。

供參考,這些是我目前使用的指標:

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 

回答

1

你應該考慮使用網卡上的MAC地址(如果存在的話)。這些通常是獨特的,但可以捏造。我使用的軟件根據您的網絡適配器MAC地址生成許可證文件,因此它被認爲是區分計算機的一種相當可靠的方法。

+5

不,他們不是。很多製造商允許你改變它們。這對於使用羣集非常有幫助,因爲某些供應商爲您提供具有相同MAC地址的所有計算機(幾年前我們遇到過這個問題)。 – gizmo 2008-09-19 05:40:25

+0

我站好了。 – 2008-09-19 05:43:53

+0

在許多情況下,這是一個有效的想法,問題並不指定欺騙手段或離線 - 如果您想在網絡中識別,您通常需要生成唯一ID – Hurda 2012-03-01 13:20:52

2

剛剛使用處理器的UniqueID呢?

+13

這些日子不是貶值的財產嗎? – 2010-06-21 03:19:23

+13

也許他的意思是「不推薦」...... CPU製造商開始在一個階段添加唯一的ID,但由於對隱私問題的抵制,他們再次停止。所以你會發現有些人擁有唯一的ID,但是大多數現代CPU都沒有。 – TripleAntigen 2011-08-29 13:29:51

+0

僅供參考,只有短暫批次的奔騰III具有可讀取的CPU序列號。雖然後來的版本有一個序列號,但默認情況下它是禁用的。奔騰IV和後來的CPU根本不支持它。 – 2012-05-05 15:26:24

-1

查找一個選項的CPUID。多CPU系統可能存在一些問題。

0

爲什麼不使用網卡的MAC地址?

+2

他沒有提到所有的計算機都有網卡。 – gizmo 2008-09-19 05:38:11

+13

Mac地址可能被欺騙 – 2009-05-22 11:26:50

0

可能會有一點作弊,但是機器以太網適配器的MAC地址很少會隨着主板的改變而改變。

2

我不想成爲誰說,這個傢伙「你只是做錯了」(我一直討厭那傢伙;),但...

是否必須爲唯一機器可重複產生的?你可以分配標識符還是公鑰/私鑰?也許如果你可以生成和存儲這個值,你可以從兩個操作系統安裝在同一個磁盤上訪問它?

您可能已經探索過這些選項,但它們不適用於您,但如果不適用,則需要考慮。

如果不是用戶信任的問題,您可以使用MAC地址。

0

你可以拉某種製造商的序列號或服務標籤嗎?

我們的商店是一家戴爾商店,因此我們使用每臺機器都獨有的服務標籤來標識它們。我知道它可以從BIOS中查詢,至少在Linux中,但我不知道如何在Windows中執行它。

1

在我的程序中,我首先檢查終端服務器並使用WTSClientHardwareId。否則,本地PC的MAC地址應該足夠。

如果您確實想使用您提供的屬性列表,則會省略諸如NameDriverVersion,Clockspeed等,因爲它可能取決於操作系統。嘗試在兩個操作系統上輸出相同的信息,並忽略它們之間的差異。

68

我有同樣的問題,經過一些研究,我決定最好的方法是按照@Agnus的建議,在註冊表鍵HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography中閱讀MachineGuid。它是在操作系統安裝過程中生成的,除非您再次安裝新的操作系統,否則不會更改。根據操作系統版本的不同,它可能包含嵌入式網絡適配器MAC地址(加上一些其他數字,包括隨機數)或僞隨機數字,後者適用於較新的操作系統版本(在XP SP2之後,我相信但不確定)。如果它是一個僞隨機理論上它可以僞造 - 如果兩臺機器具有相同的初始狀態,包括實時時鐘。在實踐中,這種情況很少見,但請注意,如果您希望它成爲受硬核黑客攻擊的安全基礎。

當然,任何人都可以很容易地修改註冊表項來僞造一臺機器的GUID,但是我發現這會破壞很多Windows組件的正常運行,在大多數情況下,沒有普通用戶會這樣做(再次,注意硬核黑客)。

1

對於我的一個應用程序,如果它是非域計算機或域計算機的域計算機帳戶SID,則使用計算機名稱。標記Russinovich談論它在這個博客帖子,Machine SID

最後的情況下重複SID將是一個問題是,如果一個分佈式應用程序所使用的機器的SID唯一標識計算機。沒有Microsoft軟件這樣做,並且以這種方式使用機器SID不適用於所有DC都具有相同機器SID的事實。依賴唯一計算機標識的軟件要麼使用計算機名稱,要麼使用計算機域SID(域中計算機帳戶的SID)。

您可以通過LDAP或System.DirectoryServices訪問域計算機帳戶SID。

25

隨着我們licensing tool我們考慮以下因素

  • MAC地址
  • CPU(不是序號,但像步進和型號CPU實際的配置文件)
  • 系統驅動器序列號(不卷標籤)
  • 內存
  • CD-ROM模型&廠商
  • 顯卡型號&廠商
  • IDE控制器
  • SCSI控制器

然而,而不只是散列的組件和創建合格/不合格體系,我們創建了一個comparable fingerprint可用於確定如何不同兩臺機器配置文件。如果差異等級高於指定的容差,則要求用戶再次激活。

我們發現在過去的8年中,成千上萬的最終用戶安裝使用這種組合可以很好地提供可靠的獨特機器ID - 即使對於虛擬機和克隆的OS安裝。