2016-01-24 25 views
2

我正在開發一個項目和我的問題,當我嘗試讓主板序列號完全變空時。獲取HWID(processorID,MotherboardSerialNumber)

Dim HWID As String = String.Empty 
Dim mcl As New ManagementClass("win32_processor") 
Dim MOBC As ManagementObjectCollection = mcl.GetInstances() 

For Each mob As ManagementObject In MOBC 
    If HWID = "" Then 
     HWID = mob.Properties("processorID").Value.ToString() 
     Exit For 
    End If 

Next 
Dim mboardstr As String = Nothing 
Dim mbs As ManagementObjectSearcher = New ManagementObjectSearcher("Select * From Win32_BaseBoard") 
For Each mo As ManagementObject In mbs.Get 
    mboardstr = mboardstr + mo("SerialNumber").ToString 
Next 
MsgBox(mboardstr) 

HWID - processorid是好,但我真的希望主板串過,因爲在那之後我把它變成一個字符串,並將其上傳到遠程主機。

爲什麼我沒有「serialnumber」?謝謝!

回答

0

並非所有數據在所有系統上都可用。在這種情況下,您正在查找的文本之前可能會有其他數據,從而導致無法讀取該字符串。 WMI非常緩慢,所以你可以通過查詢後面的內容加快速度(vs SELECT *)。

其中的一些東西應該予以處置,以釋放資源,你應該檢查的一些事情,以確保它們不爲空使用前:

Dim mboardstr As String = "" 
Dim query As String = "Select SerialNumber From Win32_BaseBoard" 

Using mbs As ManagementObjectSearcher = New ManagementObjectSearcher(query) 
    For Each mo As ManagementObject In mbs.Get 
     For Each pd As PropertyData In mo.Properties 
      ' should be only one 
      If pd.Name = "SerialNumber" Then 
       ' value is object, test for Nothing 
       If pd.Value IsNot Nothing Then 
        mboardstr = pd.Value.ToString 
       End If 
       Exit For 
      End If 
     Next 
    Next 
End Using 

你也可以設置斷點,並檢查pd.Value以查看是否存在前導字符或其他不可打印的控制字符(很常見)。你所追求的可能是「後面」。

+0

你有什麼想法如何爲每個電腦做一個特殊的ID? 因爲如果我只使用processorid爲HWID某些電腦可以有相同的?程序啓動後,我發送一個消息到一個刪除php(post方法),並檢查它的數據庫中,如果是的話,我放棄它的禁止與否,如果不是程序開始運行。如果禁止它關閉.. :)這就是爲什麼它對我來說很重要,給每個電腦特殊ID。 – Vbnetguy

+0

使用硬件散列 - 將幾段數據粘合在一起然後散列。您描述的內容可能會讓您在隱私法律方面遇到麻煩 - 存儲其他人的硬件ID。 – Plutonix

+0

是的,這就是我想要一個字符串中的幾個數據片段,然後做一個哈希值。但我沒有想法得到任何數據..我的意思是我得到了processorid,我無法獲得主板串行,因爲它的回饋不眨眼..我可以使用它嗎?在每個程序開始時它必須是相同的,這就是爲什麼我試圖用hwid來做到這一點。 – Vbnetguy