vb.net如何获取硬盘的序列号

miwuawen 2012-06-28 01:21:43
vb.net如何获取硬盘的序列号,注意不是盘符的,谢谢
...全文
633 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gszjc2010 2014-01-07
  • 打赏
  • 举报
回复
这是个类吧,怎样调用?
subMain 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
这种东西网上一搜一大把,复杂么?别人都封装好了。你拿来直接粘贴用就行了。这都觉得复杂,的确过分了有点。[/Quote]

严重同意。。
hzybc 2012-06-29
  • 打赏
  • 举报
回复
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'需要引用 Imports Scripting
ListBox1.Items.Clear()
Try
Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
Dim Uint32 As Long = 0
For Each cmicWmiObj As Management.ManagementObject In cmicWmi.Get
Uint32 = cmicWmiObj("signature") '必须要用 signature
ListBox1.Items.Add(Uint32.ToString)
Next
TextBox1.Text = Uint32.ToString
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
miwuawen 2012-06-29
  • 打赏
  • 举报
回复
获取这个硬盘的序列号 怎么这么麻烦
miwuawen 2012-06-29
  • 打赏
  • 举报
回复
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices

Public Class PhysicalDrive
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Friend Structure IDSECTOR
Public wGenConfig As Int16
Public wNumCyls As Int16
Public wReserved As Int16
Public wNumHeads As Int16
Public wBytesPerTrack As Int16
Public wBytesPerSector As Int16
Public wSectorsPerTrack As Int16
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
Public wVendorUnique() As Int16
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _
Public sSerialNumber As String
Public wBufferType As Int16
Public wBufferSize As Int16
Public wECCSize As Int16
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> _
Public sFirmwareRev As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=40)> _
Public sModelNumber As String
Public wMoreVendorUnique As Int16
Public wDoubleWordIO As Int16
Public wCapabilities As Int16
Public wReserved1 As Int16
Public wPIOTiming As Int16
Public wDMATiming As Int16
Public wBS As Int16
Public wNumCurrentCyls As Int16
Public wNumCurrentHeads As Int16
Public wNumCurrentSectorsPerTrack As Int16
Public ulCurrentSectorCapacity As Int32
Public wMultSectorStuff As Int16
Public ulTotalAddressableSectors As Int32
Public wSingleWordDMA As Int16
Public wMultiWordDMA As Int16
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> _
Public bReserved() As Byte
End Structure

<StructLayout(LayoutKind.Sequential)> _
Friend Structure DRIVERSTATUS
Public bDriverError As Byte
Public bIDEStatus As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _
Public bReserved() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _
Public dwReserved() As Int32
End Structure

<StructLayout(LayoutKind.Sequential)> _
Friend Structure SENDCMDOUTPARAMS
Public cBufferSize As Int32
Public DriverStatus As DRIVERSTATUS
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=513)> _
Public bBuffer() As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Friend Structure SRB_IO_CONTROL
Public HeaderLength As Int32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> _
Public Signature As String
Public Timeout As Int32
Public ControlCode As Int32
Public ReturnCode As Int32
Public Length As Int32
End Structure

<StructLayout(LayoutKind.Sequential)> _
Friend Structure IDEREGS
Public bFeaturesReg As Byte
Public bSectorCountReg As Byte
Public bSectorNumberReg As Byte
Public bCylLowReg As Byte
Public bCylHighReg As Byte
Public bDriveHeadReg As Byte
Public bCommandReg As Byte
Public bReserved As Byte
End Structure

<StructLayout(LayoutKind.Sequential)> _
Friend Structure SENDCMDINPARAMS
Public cBufferSize As Int32
Public irDriveRegs As IDEREGS
Public bDriveNumber As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
Public bReserved() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _
Public dwReserved() As Int32
Public bBuffer As Byte
End Structure

<StructLayout(LayoutKind.Sequential)> _
Friend Structure GETVERSIONOUTPARAMS
Public bVersion As Byte
Public bRevision As Byte
Public bReserved As Byte
Public bIDEDeviceMap As Byte
Public fCapabilities As Int32
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _
Public dwReserved() As Int32
End Structure

<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function CloseHandle(ByVal hObject As Int32) As Integer
End Function

<DllImport("kernel32.dll")> _
Private Overloads Shared Function DeviceIoControl( _
ByVal hDevice As Int32, ByVal dwIoControlCode As Int32, _
ByRef lpInBuffer As SENDCMDINPARAMS, ByVal nInBufferSize As Integer, _
ByRef lpOutBuffer As SENDCMDOUTPARAMS, ByVal nOutBufferSize As Integer, _
ByRef lpbytesReturned As Int32, ByVal lpOverlapped As Integer) As Integer
End Function

<DllImport("kernel32.dll")> _
Private Overloads Shared Function DeviceIoControl( _
ByVal hDevice As Int32, ByVal dwIoControlCode As Int32, _
ByVal lpInBuffer As Integer, ByVal nInBufferSize As Integer, _
ByRef lpOutBuffer As GETVERSIONOUTPARAMS, ByVal nOutBufferSize As Integer, _
ByRef lpbytesReturned As Int32, ByVal lpOverlapped As Integer) As Integer
End Function

<DllImport("kernel32.dll")> _
Private Shared Function CreateFile(ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Int32, _
ByVal dwFlagsAndAttributes As Int32, ByVal hTemplateFile As Integer) As Int32
End Function

Private Const GENERIC_READ As Int32 = &H80000000
Private Const GENERIC_WRITE As Int32 = &H40000000
Private Const FILE_SHARE_READ As Int32 = &H1
Private Const FILE_SHARE_WRITE As Int32 = &H2
Private Const OPEN_EXISTING As Int32 = 3
Private Const INVALID_HANDLE_VALUE As Int32 = &HFFFFFFFF
Private Const DFP_GET_VERSION As Int32 = &H74080
Private Const IDE_ATAPI_IDENTIFY As Integer = &HA1
Private Const IDE_ATA_IDENTIFY As Integer = &HEC
Private Const IDENTIFY_BUFFER_SIZE As Integer = 512
Private Const DFP_RECEIVE_DRIVE_DATA As Int32 = &H7C088

''' <summary>
''' 获取物理序列号
''' </summary>
''' <param name="id">系统硬盘序号,0-255</param>
Public Shared Function GetSerialNumber(ByVal id As Byte) As String
Dim os As OperatingSystem = Environment.OSVersion
If os.Platform <> PlatformID.Win32NT Then
Throw New NotSupportedException("仅支持2000/XP/2003")
End If
If os.Version.Major < 5 Then
Throw New NotSupportedException("仅支持2000/XP/2003")
End If
Return Read(id)
End Function

Private Shared Function Read(ByVal drive As Byte) As String
Dim driveName As String = String.Concat("\\.\PhysicalDrive", drive.ToString())
Dim device As Int32 = CreateFile(driveName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

If device = INVALID_HANDLE_VALUE Then
Return ""
End If

Dim verPara As New GETVERSIONOUTPARAMS()
Dim bytRv As Int32 = 0

If DeviceIoControl(device, DFP_GET_VERSION, 0, 0, verPara, Marshal.SizeOf(verPara), bytRv, 0) <> 0 Then
If verPara.bIDEDeviceMap > 0 Then
Dim bIDCmd As Byte = CByte(IIf((verPara.bIDEDeviceMap >> drive And &H10) <> 0, IDE_ATAPI_IDENTIFY, IDE_ATA_IDENTIFY))
Dim scip As New SENDCMDINPARAMS()
Dim scop As New SENDCMDOUTPARAMS()

With scip
.cBufferSize = IDENTIFY_BUFFER_SIZE
.bDriveNumber = drive
With .irDriveRegs
.bFeaturesReg = 0
.bSectorCountReg = 1
.bCylLowReg = 0
.bCylHighReg = 0
.bDriveHeadReg = CByte((&HA0 Or ((drive And 1) << 4)))
.bCommandReg = bIDCmd
End With
End With

If DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA, scip, Marshal.SizeOf(scip), scop, Marshal.SizeOf(scop), bytRv, 0) <> 0 Then
Dim s As New StringBuilder()
Dim i As Integer
For i = 20 To 40 - 2 Step 2
s.Append(ChrW(scop.bBuffer((i + 1))))
s.Append(ChrW(scop.bBuffer(i)))
Next i
CloseHandle(device)
Return s.ToString().Trim()
End If
End If
End If
CloseHandle(device)
Return ""
End Function
End Class


我在宏基的笔记本上可以得出结果 但是在我同事的联想机子上就得到空值,我用的是vs2010,2.0的 ,网上说不可以在win7上运行,但是今天在win7上测试过也是可以的
miwuawen 2012-06-29
  • 打赏
  • 举报
回复
逍遥不是我过分了,这代码早测试过了,只不过显示的都是ID,并不是硬盘的物理序列号(出厂序列号) 你没有明白我的意思 。 呵呵 ... 逻辑盘的序列号也可以实现的,出厂序列号不会做的,而且在不同系统上兼容性不同,可能得不到结果的。
兔子-顾问 2012-06-29
  • 打赏
  • 举报
回复
这种东西网上一搜一大把,复杂么?别人都封装好了。你拿来直接粘贴用就行了。这都觉得复杂,的确过分了有点。

Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
Dim Uint32 As UInt32

For Each cmicWmiObj As ManagementObject In cmicWmi.Get

Uint32 = cmicWmiObj("signature")

Next

TextBox1.Text = Uint32.ToString

'获得CPU序列号

Dim Wmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_Processor")

Dim Uint32 As String

For Each WmiObj As ManagementObject In Wmi.Get

Uint32 = WmiObj("ProcessorId")

Next

TextBox1.Text = Uint32

'获得硬盘总容量

Dim Wmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")

Dim Uint64 As UInt64

For Each WmiObj As ManagementObject In Wmi.Get

Uint64 = WmiObj("size")

Next

TextBox1.Text = Uint64.ToString



代码来自:http://hi.baidu.com/shgedu/blog/item/d29c5efb183a246c024f5617.html,在网吧,代码未测试,感觉靠谱。
miwuawen 2012-06-29
  • 打赏
  • 举报
回复
楼上的 先谢谢你 你获取的是硬盘的ID 不是物理序列号 而且你的textbox1.text结果是0
kxyzjm62 2012-06-28
  • 打赏
  • 举报
回复

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧