2009-08-20 34 views
6

使用C#可以輕鬆獲得什麼樣的「唯一」系統標識符(以散列並隨後唯一標識系統)?我只能散列硬盤大小和類似的東西,但我需要識別和區分所有由相同組件構建的計算機,所以我不能這樣做。在C#中獲取唯一的系統標識符

欣賞提示,想法,示例代碼!

+0

我會小心這個,你不會讓你的客戶討厭你。他們應該能夠更改網卡,硬盤和內存大小,而不必告訴你。 – 2009-08-21 00:39:20

+4

噢,這個要求實際上來自*客戶:) – Alex 2009-08-21 01:40:28

回答

8

這裏有一個良好的開端WMI ...

// Win32_CPU will work too 
var search = new ManagementObjectSearcher("SELECT * FROM Win32_baseboard"); 
var mobos = search.Get(); 

foreach (var m in mobos) 
{ 
    var serial = m["SerialNumber"]; // ProcessorID if you use Win32_CPU 
} 

你可以做到這一點的多件硬件並提出解決方案。

+0

我嘗試過......但我看到這些都是天,沒有任何序列號正在維護。母板,處理器...... MAC正在通過更改NIC來更改......要選擇什麼? – Rick2047 2010-08-25 14:58:38

+0

因爲Win32_BaseBoard SerialNumber在大多數情況下不會返回值,所以最好的選擇是Win32_Processor中的ProcessorID – CJxD 2012-03-22 16:49:31

+0

請注意,對於相同類型的所有處理器,ProcessorID是相等的。如果你測試兩個i7-FooBar處理器,兩者都有相同的ID。 – ANeves 2018-03-05 18:40:17

2

您可以在C#中使用WMI以獲取相關的硬件信息。

硬盤ID和以太網MAC地址是在系統識別方案中使用的兩個常見的唯一標識符。理論上,MAC地址是每個網卡唯一的。

+1

從理論上講,但實際上沒有可以使用的唯一的唯一ID,因爲有噸並且易於訪問,所以最好抓住兩個或三個結合他們創建一個唯一的字符串(或散列) – 2009-08-20 21:38:31

+0

是的,我同意。這就是爲什麼「在理論上」:) – 2009-08-20 21:48:49

8

您可以使用System.Management命名空間獲取與硬件,ProcessorId,MAC地址以及更多信息相關的所有內容,然後您可以將它們散列在一起。

看看這篇文章:

http://www.codeproject.com/KB/system/GetHardwareInformation.aspx

+0

要擴大這個和其他答案一點點: 網卡的MAC地址將是唯一的,即使機器都使用相同的組件。我會從那開始。 其次,你應該能夠獲得主板和CPU序列號,正如JP所說。 這些加上物理網卡的MAC地址應該足夠容易地唯一標識一臺機器。請注意,如果更換部件,所有這些都可能會發生變化。 – 2009-08-20 22:01:19

+0

網卡的MAC地址可以通過軟件設置,因此您不能指望它是唯一的。另一方面,我認爲主盤+ MAC地址+ processorId +主板可能是一個安全的選擇。 – 2009-08-20 22:37:48

2

假設你正在談論的Windows,那麼每個Windows安裝都有一個唯一的產品ID(當您查看我的電腦的性能,你可以看到) 。我認爲這存儲在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion:ProductId(REG_SZ)。我比你想要的更多嗎?

+0

這看起來酷酷。 – Rick2047 2010-08-25 15:00:40

0

你可以考慮使用GUID's

+2

+1 Microsoft的GUID實現使用MAC地址和當前時間,所以它們幾乎是一種創建標識符的有保證的方式,這些標識符在每臺計算機上都是唯一的。 – 2009-09-13 10:34:42

2

網卡的MAC地址:

foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    // probably need to do some filtering on ni.NetworkInterfaceType here 
    Console.WriteLine(ni.GetPhysicalAddress()); 
} 
+1

雖然這是一個好主意,但是如果系統沒有NIC,它就會失敗! – Smith 2011-10-15 15:26:23

+1

這不是一個好主意,因爲當用戶禁用連接或軟件安裝虛擬連接時,此id會發生變化 – 2015-07-10 10:40:38