強力鎯頭 の 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
在VB6執行時,主機序號(看嚨嘸)沒正確抓到.
回覆刪除這是引用,我也實際測過;也是無路用,不準確
回覆刪除在winxp 或 win7 會有所不同,要取硬碟序號最準確的還是要用些偷吃步,拿硬體偵測的工具(dll)等來套用