Login  

Blog Stats

News


Visual Developer - Visual Basic MVP

隨筆分類

文章分類

每月文章

優質好站連結


強力鎯頭 の VB 部落

歡迎蒞臨 Power Hammer の VB 部落 ! J 裡會放一些 VB .Net Oracle Crystal Report 等相關資訊分享給大家囉..

 

如何取得 硬碟 主機板 序號

 

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

 

 

posted on Monday, February 05, 2007 4:47 PM

What People Are Saying About This Post...

# re: 如何取得 硬碟 及 主機板 序號 2/28/2007 4:57 AM MAX
站長您好
我想請問我按照您上面示範的程式寫.硬碟序號部份.則會顯示

類型 'System.Runtime.InteropServices.COMException' 的未處理例外狀況發生於 microsoft.visualbasic.dll

以上的資訊.後我將硬碟部份程式碼刪除掉.只想顯示主機板部分.則未出現序號.請問是否還要加入COM元件參考.
我用的是 VB.NET 2002 版的. 謝謝

# re: 如何取得 硬碟 及 主機板 序號 3/3/2007 9:47 AM Power Hammer
Hi , 您好
請問您是用 VB.Net 2003 嗎 ?
個人的 Code 是在 VB.Net 2005 撰寫並測試 , VB6 也有
但 , 理論上 VB.Net 2003 應該也能正確執行才對
請問您的 作業系統是 ? Win2K 還是 WinXP 呢 ?

# re: 如何取得 硬碟 及 主機板 序號 3/22/2007 9:43 AM ASP.NET新手
您好,我是直接複製您所貼的CODE去做測試
作業系統是Windows Server 2003 R2 Enterprise Edition
我用VB.NET 2003 和 VB.NET 2005去測試時
硬碟序號均顯示空白
主機板序號則顯示123456789000,這個序號似乎也有問題

這是因為作業系統的關係所導致的嗎?

# re: 如何取得 硬碟 及 主機板 序號 4/1/2007 2:45 PM Power Hammer
Hi , ASP.Net 高手您好

關於您說的 Win Server 2003 R2 個人沒這個環境測試

個人的 Notebook XP 環境測 OK
但我同事的桌上型XP環境,機板序號則是空的

關於降子的問題,個人目前並不知道原因
(猜想會不會是登錄OS權限問題...或其他..)

本篇文章有在補充 << VB.Net >> 寫法 2 , 您可參考再試看看..
另外,不才有另一篇 C# 取硬碟序號的..參考如下:
http://blog.blueshop.com.tw/hammerchou/archive/2006/10/12/42247.aspx


# re: 如何取得 硬碟 及 主機板 序號 4/24/2007 11:04 AM ASP.NET新手
呃~我不是高手啦~呵呵~

sno = mo("SerialNumber").ToString.Trim ' 註5
寫法二的這一行
我在vb.net 2003及vb.net 2005中測試時均出現錯誤
"並未將物件參考設定為物件的執行個體"

不過小弟不才,對於VB.NET處理IO的部份沒有研究
僅是心血來潮取用您的教學來做練習
所以也不曉得問題出在哪裡~
我所使用的作業系統一樣還是Windows Server 2003 R2 Enterprise Edition

目前尚未拿到XP的機器上去做測試 = =|||

# re: 如何取得 硬碟 及 主機板 序號 5/3/2007 2:37 PM Power Hammer
不好意思
手邊目前沒 Win2003
是用 WinXP , VS.Net 2005 測試的
改天有機會我在試看看囉

# re: 如何取得 硬碟 及 主機板 序號 8/26/2007 1:38 AM 阿乾
我再vb6執行時為什麼輸入磁碟2就出錯呢

# re: 如何取得 硬碟 及 主機板 序號 9/26/2007 11:54 AM Power Hammer
您有1顆以上的硬碟嗎?

# re: 如何取得 硬碟 及 主機板 序號 10/24/2007 5:15 PM ivan
我是使用vb.0在XP上執行,但卻未能將主機板序號顯示出。請問該如何解決?

# re: 如何取得 硬碟 及 主機板 序號 12/19/2007 12:09 AM 阿乾
我有3顆硬碟

# re: 如何取得 硬碟 及 主機板 序號 6/19/2009 9:32 AM IDIOT
我想問一下USB隨身碟捉不到正常嗎?

What do you have to say?

Title:
Name:
Url:
驗證碼  
Comments: