[VB6/VB.NET] ค้นหา Harddisk ที่ติดตั้ง Windows พร้อมกับอ่านค่า Physical Serial Number ด้วย WMI
http://www.g2gnet.com/webboard/images/vb6/getbootdiskserial.pngWMI หรือ 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]