2014-03-29 53 views
0

我的平臺是Windows 7(或更高版本),而且我在使用Visual Studio 2010中C++/Windows的:獲取唯一的機器ID:MAC地址,卷序列號,

在試圖得到一個唯一機器標識符,我試圖檢索的MAC地址,我遇到了以下問題。

我有困難識別其是從由GetAdapatersInfo方法返回適配器列表主以太網網絡適配器。

我可以檢查它們的類型(它應該是MIB_IF_TYPE_ETHERNET)獲得以太網適配器列表。

不過,也有我的機器上的多個以太網適配器:實際LAN適配器,思科創建的軟件適配器,藍牙以太網adapater等

取決於我如何連接到互聯網,這個名單不斷變化。

那麼,我怎麼知道哪一個是實際的以太網適配器(將使用LAN電纜連接的那一個)。

+0

我仍在挖掘答案。但是,僅僅想指出「GetAdaptersAddresses」方法提供了IP_ADAPTER_ADDRESSES結構。該結構具有「友好名稱」字段。這個字段的值可以用來評估它是否是「本地連接」。不知道,這種方法有多可靠。 –

+0

但是,仍然在尋找答案,我發現「UuidCreateSequential」使用「主」NIC來生成UUID。主NIC根據我如何連接到互聯網不會改變。完整的例子在以下位置。 http://www.codeguru.com/cpp/in/network/networkinformation/article.php/c5451/Three-ways-to-get-your-MAC-address.htm –

+0

只是想補充說主要mac地址可能如果/當計算機重啓時以及CISCO VPN等服務創建/刪除虛擬網絡適配器時更改。仍然努力尋找一種可靠的方法來生成唯一的機器ID –

回答

1

好,

經歷過了一段時間(一個月左右)後,卷數,似乎是生成唯一的ID是在重新啓動後持久的,不能被用戶改變一個可靠的指標。除非磁盤重新格式化,否則此ID不會更改。

以下代碼提取卷號。

int getVolumeNumber(char *volumeNumber, int capacity) { 
for(int i=0; i<capacity; i++) { 
    volumeNumber[i] = '\0'; 
} 
TCHAR volumeName[MAX_PATH + 1] = { 0 }; 
TCHAR fileSystemName[MAX_PATH + 1] = { 0 }; 
DWORD serialNumber = 0; 
DWORD maxComponentLen = 0; 
DWORD fileSystemFlags = 0; 
if(GetVolumeInformation(_T("C:\\"), volumeName, ARRAYSIZE(volumeName), &serialNumber, &maxComponentLen, &fileSystemFlags, fileSystemName, ARRAYSIZE(fileSystemName)) != 0) { 
    sprintf(volumeNumber,"%lu",serialNumber); 
    return 0; 
} else { 
    return 1; 
} 

}

在上面的代碼,我擷取C的卷號:驅動器。

0

「的卷號碼似乎是用於產生唯一ID的可靠指標是在重新引導後持久性並且不能由用戶改變。」

本聲明的最後部分(「不能被用戶更改」)不正確。有幾個實用程序可以更改或欺騙卷序列號。 參見例如https://www.raymond.cc/blog/changing-or-spoofing-hard-disk-hardware-serial-number-and-volume-id/。 根據您的使用情況,您可能會更好地使用硬盤序列號(略微),硬盤序列號由高清製造商提供,用戶無法更改(但CAN被欺騙)。它可以使用Win32_PhysicalMedia類(https://msdn.microsoft.com/en-us/library/windows/desktop/aa394346%28v=vs.85%29.aspx)進行檢索。

另一種選擇可能是枚舉所有以太網適配器,對它們進行排序和比較的結果 - 但似乎你已經調查了這條路。

一般來說,任何可以用作PC的唯一ID的東西都可以用於「軟件保護」(即防止未經授權使用軟件),因此很有可能人們試圖找到方法規避它。

+0

我同意硬盤序列號可能比卷號更可靠。就欺騙而言,沒有任何東西(據我所知)是免疫的。網絡適​​配器不可靠,容易被欺騙。 –