2013-06-03 55 views
2

是否有任何唯一的設備ID(UDID)或任何類似的ID,我可以在Windows 8上讀出不會隨硬件更改,應用程序重新安裝等而更改的ID?用於Windows 8的UDID

如果否 - 自己生成它的最佳方法是什麼?

+1

的可能重複的碼(http://stackoverflow.com/questions/13975315/get-unique-device [在Windows電話8獲取唯一的設備ID(UDID)] -id-UDID - 下 - 窗口電話-8) –

+0

MAC地址主要用於當UDID不可 – EaterOfCode

+2

@ Prof.Falken爵士,閱讀。 Windows 8和Windows Phone 8,它不一樣,關閉。但仍然不同 – EaterOfCode

回答

10

是的。

不,沒有這樣的ID,因爲(理論上)你可以更改任何硬件組件,這樣你可能會得到完全不同的ID(這就是爲什麼微軟建議根據ASHWID計算得分的原因)。

是的,有這樣的ID(但它可能不適用於你的情況)。 如果你不能依靠硬件,因爲它很容易添加內存,更換磁盤,添加另一個網卡(例如打開/關閉藍牙或Wi-Fi),那麼你必須依靠一個「軟件」ID。

在註冊表中有一個在Windows安裝過程中生成的唯一ID,在重新安裝Windows之前它不會更改。您可以在HKLM/Software/Microsoft/Cryptography中找到此ID,它是一個名爲MachineGuid的字符串。

如果你能確定一個組件,你肯定不會改變(例如主板),你可以使用一個簡單的WMI查詢來獲得它的序列號,但你應該總是提供一個回退,因爲許多MBs會返回一個假S/N(並且虛擬機可能總是返回相同的)。什麼是適當的解決方案......這取決於你需要用這個ID做什麼。確定用戶?檢查許可證?加密數據?這些中的每一個都有不同的ID「最佳實踐」。

獲取一個唯一的ID爲設備
如果非要找出一個特定設備(不管用戶),你有很多選擇,我寧願做的是隻使用穩定的數據來生成一個ID (例如,來自主板和BIOS的S/N)。這不會幫助你,如果他/她完全更新它的硬件,但它應該是穩定的足夠(但你必須定義什麼是足夠在你的情況)。您甚至可以使用主磁盤的序列號(使用便攜式設備,它非常穩定,您甚至可以將其與其他序列號結合使用以建立自己的ID)。您可以通過WMI或(如果您針對WinRT)通過ASHWID結構的特定字節獲取此信息。

數據進行加密,
在這種情況下,你必須考慮當數據可能無法恢復。如果硬件發生小變化,用戶將無法很好地閱讀以前的文件,他們會不高興。在這種情況下,我會建議使用MachineGuid,除非他們重新安裝操作系統,他們不必擔心(但爲他們做一個忙,並提供一種方法來回讀某個GUID)。如果您確定自己的目標是手機或平板電腦等便攜式設備,那麼磁盤序列號(或CPU ID,如果有的話,或者MB或BIOS)也可能適用(因爲它很少見,它們會改變)。

許可協議
我會使用許多(穩定)ID的組合。至於設備的唯一標識符,您無法確定沒有任何變化。在過去,MAC地址被廣泛用於此,但移動設備更改了這些規則(因爲很容易關閉NIC)。你仍然可以使用它們,但你必須特別小心(和代碼)來管理這種情況。再次,多個ID(仔細選擇)的組合可以幫助您最大限度地減少客戶在更改hw/sw設置時的工作量。在這種情況下,一個好的妥協可能是OS序列號(而不是MachineGuid)。如果他們安裝了新的操作系統,那麼他們也必須更新您的許可證(但我會將其與其他內容結合使用以確保它們不會在多臺計算機或虛擬機上使用相同的操作系統副本)。

注意有關虛擬機
如果你有目標虛擬機太然後事情就變得更加複雜。理論上,用戶可以使用完全相同的硬件和軟件配置創建同一個VM的多個副本。 如果這是一個問題,如果不能(使用網絡檢查爲例)妥善解決這個問題,我建議你不要支持他們在所有的(如果你發現一個VM只需要退出)。

+0

只需添加一個註釋爲commnet:如果您正在編程Windows(WinRT或不),您不能真正依賴「通用」ID。臺式機/便攜式電腦不是手機/平板電腦(硬件不會改變)。 –

+0

感謝您提供非常有幫助的答案。 – jimpanzer

0

這裏是在JavaScript代碼示例,其過濾形式ASHWID是不太可能的硬件模塊將被改變(CPU ID,存儲器大小,盤裝置和BIOS的序列號),並轉換成字符串。該代碼是基於從該thread

// get the hardware Profile id and convert it to byte Array 
var hardwareToken = Windows.System.Profile.HardwareIdentification.getPackageSpecificToken(null); 
var byteArray = Windows.Security.Cryptography.CryptographicBuffer.copyToByteArray(hardwareToken.id); 

var deviceSerial = '', 
    offset = 0; 
// we filter the hardware modules that are unlikely to be changed, and aggregate them to a string. 
while (offset < hardwareToken.id.length) 
{ 
    // CPU ID of the processor || Size of the memory || Serial number of the disk device || BIOS 
    if ((byteArray[offset] == 1 || byteArray[offset] == 2 || byteArray[offset] == 3 || byteArray[offset] == 9) && byteArray[offset+1] == 0) 
    { 
     for (var i=0; i<4; i++) 
     { 
      deviceSerial += byteArray[offset+i].toString(); 
     } 
    } 
    offset += 4; 
}