thongkorn โพสต์ 2019-1-25 11:14:20

[VB6/VB.NET] ค้นหา Harddisk ที่ติดตั้ง Windows พร้อมกับอ่านค่า Physical Serial Number ด้วย WMI

http://www.g2gnet.com/webboard/images/vb6/getbootdiskserial.png

WMI หรือ Windows Management Instrumentation แอดมินได้กล่าวไปถึงหลายรอบแล้ว ก็จะสรุปให้ฟังอีกทีล่ะกันครับ WMI เป็นการดำเนินการกับรีจิสทรีในระบบไฟล์ ทั้งการค้นหา การกำหนดค่าฮาร์ดแวร์และการจัดการตั้งค่าของ Windows เอง โดยมี Namespace หลักคือ "root\cimv2" ประกอบด้วย Class ที่สามารถเรียกใช้งานได้มากกว่า 500 Class โดยมีหมวดหมู่หลักๆดังนี้คือ ...
[*]Computer system hardware
[*]Operating System
[*]Installed Applications
[*]Internal WMI Service settings
[*]Performance Counter
[*]Helper Classes

http://www.g2gnet.com/webboard/images/vbnet/wmicreator.png
ดาวน์โหลด WMI Code Creator v1.0 ...

กรณีที่เครื่องคอมพิวเตอร์ทำการติดตั้งฮาร์ดดิสต์เอาไว้หลายลูก โค้ดชุดนี้เป็นการใช้ WMI ในการทดสอบว่าฮาร์ดดิสต์ลูกไหนเป็นตัว Boot ระบบปฏิบัติการ Windows จากนั้นก็จะทำการค้นหา Physical Serial Number ซึ่งค่านี้จะไม่มีการเปลี่ยนแปลงได้เลย ซึ่งตัวแอดมินนำไปใช้ในการล็อคโปรแกรมของตัวเองนั่นเอง (แต่ต้องมีการเข้ารหัสอีกทีน่ะครับ) ...

มาดูโค้ดสำหรับ VB6 ...
Private Function GetBootDiskSerial() As String
    Dim SerialHDD As String
    Dim OSName As String
    Dim strComputer As String
    '//
    Dim oWMI As Object
    Dim objItem As Object
    Dim colItems As Object
   
    strComputer = "."
    Set oWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    '// ค้นหา Windows OSและ Hard Disk ลูกที่บู๊ตระบบ
    Set colItems = oWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem", , 48)
    For Each objItem In colItems
      '// คำตอบที่ได้
      '// Microsoft Windows 10 Pro|C:\Windows|\Device\Harddisk0\Partition2
       OSName = objItem.Name
    Next
   
    '// "Microsoft Windows 10 Pro|C:\Windows|\Device\Harddisk0\Partition2"
    Dim Pos As Integer
    '// หาคำว่า Harddisk เมื่อเจอมันจะรีเทิร์นค่าตำแหน่ง H ตัวแรก แต่ให้บวกเพิ่มเข้าไปอีก 8 ตัวอักขระ
    Pos = InStr(OSName, "Harddisk") + 8
    '// ชุดข้อมูลที่ต้องการ Harddisk0 ให้เอาตัวเลขที่ต่อจาก Harddisk (คือ 0)
    Dim HddIndex As Byte
    '// อ่านค่าตัวเลขหลักสุดท้ายจะได้ 0
    HddIndex = Mid(OSName, Pos, 1)
   
    '// แอดมินลองทดสอบดู Harddisk0 มันเป็นตัวเดียวกับ PHYSICALDRIVE0
    Dim Hd As String
    For Each objItem In oWMI.InstancesOf("Win32_PhysicalMedia")
      ' "\\.\PHYSICALDRIVE0"
      Hd = "\\.\PHYSICALDRIVE" & HddIndex
      '// เอา Serial Number ของ PHYSICALDRIVE0
      If objItem.Tag = Hd Then
            SerialHDD = objItem.SerialNumber
            Exit For
      End If
    Next
    GetBootDiskSerial = Replace(Trim(SerialHDD), Chr(0), "")
End Functionการเรียกใช้งาน MsgBox GetBootDiskSerial ...

สำหรับ VB.NET ก่อนทำการเรียกใช้งาน WMI ได้ จะต้อง Reference System.Management เข้ามาก่อนครับ ...
http://www.g2gnet.com/webboard/images/vbnet/SystemManagement.png

มาดูโค้ดสำหรับ VB.NET ... '// ไปที่ Reference ต้อง Add System.Management เข้ามาด้วย
Imports System.Management
    Public Function GetBootDiskSerial() As String
      Dim Finder As ManagementObjectSearcher = New ManagementObjectSearcher("Select * from Win32_OperatingSystem")
      Dim Name As String = ""
      Dim SerialNumber As String = ""

      For Each OS As ManagementObject In Finder.()
            Name = OS("Name").ToString()
      Next
      Dim ind As Integer = Name.IndexOf("Harddisk") + 8
      Dim HardIndex As Integer = Convert.ToInt16(Name.Substring(ind, 1))
      Finder = New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Index=" & HardIndex)
      For Each HardDisks As ManagementObject In Finder.()
            For Each HardDisk As ManagementObject In HardDisks.GetRelated("Win32_PhysicalMedia")
                SerialNumber = HardDisk("SerialNumber").ToString()
            Next
      Next

      Return Trim(SerialNumber).Replace(Chr(0), "")
    End Function
การเรียกใช้งาน MsgBox(GetBootDiskSerial) ...
หน้า: [1]
ดูในรูปแบบกติ: [VB6/VB.NET] ค้นหา Harddisk ที่ติดตั้ง Windows พร้อมกับอ่านค่า Physical Serial Number ด้วย WMI