2009-08-29 65 views
2

我寫了下面的代碼來獲取物理媒體序列號,但在我的一臺計算機中,它返回null。 有誰知道問題是什麼? 謝謝。問題與Win32_PhysicalMedia SerialNumber屬性

var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"); 
foreach(ManagementObject mo in searcher.Get()) 
{ 
    Console.WriteLine("Serial: {0}", mo["SerialNumber"]); 
} 
+0

參見http://stackoverflow.com/questions/1502812/problem-with-wmi – finnw 2009-10-04 11:12:07

回答

3

序列號是可選的,由製造商定義,對於您的設備,它是空的或不被驅動程序支持。

幾乎所有的硬盤都有一個序列號,但是大多數USB風格的閃存棒都沒有(通常是成本問題)。我想大多數沒有品牌的CD/DVD/BD光盤也是非序列化的。

+0

我使用該系統既XP和Win7 RC1和只有一個硬盤在Win7中它會返回硬盤序列號,但在XP中它會返回null。 – mrtaikandi 2009-08-30 09:42:35

+0

你的意思是,對於同一個磁盤,序列號是在Windows 7中返回的,而不是在Windows XP中返回的?在任何情況下,請使用wbemtest.exe來驗證您的代碼是否返回了正確的值 - 如果Windows XP中的SerialNumber屬性爲,則無法對此做任何處理。 – 2009-08-30 11:24:16

1

這裏是我使用的代碼,序列號以某種方式返回原始與每對字符顛倒(奇怪)和使用Win32_PhysicalMedia給出了不同的結果,如果我作爲用戶或管理員(更奇怪)運行代碼 - Windows用VB 7旗艦版,VS 2008只:

Function GetHDSerial() As String 
    Dim strHDSerial As String = String.Empty 
    Dim index As Integer = 0 
    Dim Data As String 
    Dim Data2 As String 
    Dim ndx As Integer 

    Dim query As New SelectQuery("Win32_DiskDrive") 
    Dim search As New ManagementObjectSearcher(query) 
    Dim info As ManagementObject 
    Try 
     For Each info In search.Get() 
      Data = info("SerialNumber") 
      Data2 = "" 
      For ndx = 1 To Data.Length - 1 Step 2 
       Data2 = Data2 & Chr(Val("&H" & Mid(Data, ndx, 2))) 
      Next ndx 
      Data = String.Empty 
      For ndx = 1 To Data2.Length - 1 Step 2 
       Data = Data & Mid(Data2, ndx + 1, 1) & Mid(Data2, ndx, 1) 
      Next 
      Data2 = Data 
      If Len(Data) < 8 Then Data2 = "00000000" 'some drives have no s/n 
      Data2 = Replace(Data2, " ", "") ' some drives pad spaces in the s/n 
      'forget removeable drives 
      If InStr(info("MediaType").ToString, "Fixed", CompareMethod.Text) > 0 Then 
       strHDSerial = strHDSerial & "Drive " & index.ToString & " SN: " & Data2 & vbCrLf 
       index += 1 
      End If 
     Next 
    Catch ex As Exception 
     strHDSerial = "Error retrieving SN for Drive " 
     msgbox(index.ToString) 
    End Try 
    Return strHDSerial 
End Function