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

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

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

使用 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