2009-08-29 257 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