2010年7月15日 星期四

如何取得 硬碟 及 主機板 序號

強力鎯頭 の VB 部落
如何取得 硬碟 及 主機板 序號



使用 WMI ( Windows Management Instrumentation ) 來取得



<< VB.Net >> 寫法 1



Imports System.Runtime.InteropServices



Public Class Form1



Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load



MessageBox.Show("硬碟序號 : " & Get_PscDrv_SNo(0) & _

ControlChars.CrLf & ControlChars.CrLf & _

"主機板序號 : " & Get_MB_SNo())



End Sub





' 取得硬碟序號 ( 實體磁碟 )

' 當有多顆硬碟時, 可調傳入參數為 1 , 2 .. 依此類推

Private Function Get_PscDrv_SNo(ByVal DrvIdx As Byte) As String



Dim WMI As Object = GetObject("winmgmts:") ' 取得WMI 物件



' GetObject : 傳回COM 元件所提供物件的參考。



Dim strCls As String = "Win32_PhysicalMedia" ' WMI 類別



Dim strKey As String = strCls & ".Tag=""\\\\.\\PHYSICALDRIVE" & DrvIdx & """"



Return WMI.InstancesOf(strCls)(strKey).SerialNumber.ToString.Trim ' 取得SerialNumber 屬性



Marshal.ReleaseComObject(WMI) ' 釋放Com 物件所使用的資源



End Function





' 取得主機板序號

Private Function Get_MB_SNo() As String



Dim WMI As Object = GetObject("winmgmts:") ' 取得WMI 物件



' GetObject : 傳回COM 元件所提供物件的參考。



Dim strCls As String = "Win32_BaseBoard" ' WMI 類別



Dim strKey As String = strCls & ".Tag=""Base Board"""



Return WMI.InstancesOf(strCls)(strKey).SerialNumber.ToString.Trim ' 取得SerialNumber 屬性



Marshal.ReleaseComObject(WMI) ' 釋放Com 物件所使用的資源



End Function



End Class

' ================================================================





<< VB.Net >> 寫法 2



請先加入參考 System.Management



Imports System.Management



Private Function Get_Motherboard_Sno() As String

Dim mc As New ManagementClass("Win32_BaseBoard") ' 註1

mc.Scope.Options.EnablePrivileges = True ' 註2

Dim sno As String = ""

For Each mo As ManagementObject In mc.GetInstances() ' 註3

sno = mo("SerialNumber") ' 註4

Next

mc.Dispose() ' 註5

Return sno

End Function



' 註1 :

' ManagementClass 類別 : 表示通用訊息模型 (CIM) 管理類別, 管理類別是指 WMI 類別。



' 註2:

' ConnectionOptions.EnablePrivileges 屬性 : 取得或設定,連接作業啟用使用者權限。



' 註3:

' ManagementObject 類別 : 表示 WMI 執行個體。

' 使用 Foreach 陳述式存取集合類別中物件 (元素)

' ManagementClass.GetInstances 方法 : 傳回類別所有執行個體的集合。



' 註4:

' 取得主機版序號屬性

' sno = mo("SerialNumber") 等同於 sno = mo.GetPropertyValue("SerialNumber")

' ManagementBaseObject.GetPropertyValue 方法 : 取得屬性值的對等存取子。



' 註5:

' 釋放所使用的資源。





' 當有多顆硬碟時, 可調傳入參數為1 , 2 .. 依此類推, 0 為第一顆硬碟

Private Function Get_HD_Sno(ByVal idx As Byte) As String

Dim qry As String = "SELECT * FROM Win32_PhysicalMedia" & _

" Where Tag = '\\\\.\\PHYSICALDRIVE" & idx & "'" ' 註1

Dim mos As New ManagementObjectSearcher(qry) ' 註2

mos.Scope.Options.EnablePrivileges = True ' 註3

Dim sno As String = ""

For Each mo As ManagementObject In mos.Get() ' 註4

sno = mo("SerialNumber").ToString.Trim ' 註5

Next

mos.Dispose() ' 註6

Return sno

End Function



' 註1:

' 查詢 "物理磁碟機 (媒體) 序號" 的 SQL 語法。



' 註2:

' ManagementObjectSearcher 類別 : 根據指定的查詢擷取管理物件的集合。

' 這個類別是其中一個較為經常用來擷取管理資訊的進入點 (Entry Point) 。

' 例如,它可以用來列舉所有磁碟機、網路介面卡 (Adapter) 、處理序

' 和系統上其他更多的管理物件,或用來查詢所有正在使用的

' 網路連接、暫停的服務,等等。



' 註3:

' ConnectionOptions.EnablePrivileges 屬性 : 取得或設定,連接作業啟用使用者權限。



' 註4:

' ManagementObject 類別 : 表示 WMI 執行個體。

' 使用 Foreach 陳述式存取集合類別中物件 (元素)

' ManagementClass.GetInstances 方法 : 傳回類別所有執行個體的集合。



' 註5:

' 取得物理磁碟機序號屬性

' sno = mo("SerialNumber") 等同於 sno = mo.GetPropertyValue("SerialNumber")

' ManagementBaseObject.GetPropertyValue 方法 : 取得屬性值的對等存取子。

' 使用 Trim 函式用意是去掉空白



' 註6:

' 釋放所使用的資源。



Private Sub Button1_Click(ByVal s As Object, ByVal e As EventArgs) Handles Button1.Click

MessageBox.Show("硬碟序號: " & Get_HD_Sno(0) & _

ControlChars.CrLf & ControlChars.CrLf & _

"主機板序號: " & Get_Motherboard_Sno())

End Sub






' ================================================================





<< VB6 >>



Private Sub Form_Load()



MsgBox "硬碟序號 : " & Get_PscDrv_SNo(0) & _

vbCrLf & vbCrLf & _

"主機板序號 : " & Get_MB_SNo



End Sub





' 取得 硬碟 序號

' 當有多顆 硬碟 時 , 可調整為 1 , 2 .. 依此類推

Private Function Get_PscDrv_SNo(DrvIdx As Byte) As String



Dim strCls As String, strKey As String

Dim WMI As Object



Set WMI = GetObject("winmgmts:")



strCls = "Win32_PhysicalMedia" ' WMI 類別

strKey = strCls & ".Tag=""\\\\.\\PHYSICALDRIVE" & DrvIdx & """"



Get_PscDrv_SNo = Trim(WMI.InstancesOf(strCls)(strKey).SerialNumber)



End Function





' 取得 主機板 序號

Private Function Get_MB_SNo() As String



Dim strCls As String, strKey As String

Dim WMI As Object



Set WMI = GetObject("winmgmts:")



strCls = "Win32_BaseBoard" ' WMI 類別

strKey = strCls & ".Tag=""Base Board"""



Get_MB_SNo = Trim(WMI.InstancesOf(strCls)(strKey).SerialNumber)



End Function

2 則留言:

  1. 在VB6執行時,主機序號(看嚨嘸)沒正確抓到.

    回覆刪除
  2. 這是引用,我也實際測過;也是無路用,不準確
    在winxp 或 win7 會有所不同,要取硬碟序號最準確的還是要用些偷吃步,拿硬體偵測的工具(dll)等來套用

    回覆刪除