1. 程式人生 > >vb獲取cpuid 硬碟物理序列號和邏輯盤序列號 的方法

vb獲取cpuid 硬碟物理序列號和邏輯盤序列號 的方法

一、使用WMI獲取

 通過WMI獲得硬碟和CPU的物理序列號(VB.net)

''獲得硬碟序列號

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

首先,引用System.Management;然後在程式碼中Imports System.Management;

private void GetInfo()
  {
   string cpuInfo = "";//cpu序列號
   ManagementClass cimobject = new ManagementClass("Win32_Processor");
   ManagementObjectCollection moc = cimobject.GetInstances();
   foreach(ManagementObject mo in moc)
   {
    cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
    Response.Write ("cpu序列號:"+cpuInfo.ToString ());
   }

   //獲取硬碟ID
   String HDid;
   ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
   ManagementObjectCollection moc1 = cimobject1.GetInstances();
   foreach(ManagementObject mo in moc1)
   {
    HDid = (string)mo.Properties["Model"].Value;
    Response.Write ("硬碟序列號:"+HDid.ToString ());
   }


   //獲取網絡卡硬體地址
9558821702001755616
   
   
   ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
   ManagementObjectCollection moc2 = mc.GetInstances();
   foreach(ManagementObject mo in moc2)
   {
    if((bool)mo["IPEnabled"] == true)
     Response.Write("MAC address/t{0}"+mo["MacAddress"].ToString());
    mo.Dispose();
   }
  }

 

二、獲取物理硬碟的id

Private Const MAX_IDE_DRIVES       As Long = 4
Private Const IDENTIFY_BUFFER_SIZE       As Long = 512
Private Const DFP_SEND_DRIVE_COMMAND       As Long = &H7C084
Private Const DFP_RECEIVE_DRIVE_DATA       As Long = &H7C088

Private Type GETVERSIONOUTPARAMS
        bVersion   As Byte                 '   Binary   driver   version.
        bRevision   As Byte               '   Binary   driver   revision.
        bReserved   As Byte               '   Not   used.
        bIDEDeviceMap   As Byte       '   Bit   map   of   IDE   devices.
        fCapabilities   As Long       '   Bit   mask   of   driver   capabilities.
        dwReserved(3)   As Long       '   For   future   use.
End Type
Private Type IDEREGS
        bFeaturesReg   As Byte                 '   Used   for   specifying   SMART   "commands".
        bSectorCountReg   As Byte           '   IDE   sector   count   register
        bSectorNumberReg   As Byte         '   IDE   sector   number   register
        bCylLowReg   As Byte                     '   IDE   low   order   cylinder   value
        bCylHighReg   As Byte                   '   IDE   high   order   cylinder   value
        bDriveHeadReg   As Byte               '   IDE   drive/head   register
        bCommandReg   As Byte                   '   Actual   IDE   command.
End Type

Private Type SENDCMDINPARAMS
        cBufferSize   As Long                   '   Buffer   size   in   bytes
        irDriveRegs   As IDEREGS             '   Structure   with   drive   register   values.
        bDriveNumber   As Byte                 '   Physical   drive   number   to   send
        bReserved(2)   As Byte                 '   Reserved   for   future   expansion.
        dwReserved(3)   As Long               '   For   future   use.
        bBuffer(0)   As Byte                     '   Input   buffer.
End Type
Private Const IDE_ATAPI_ID       As Long = &HA1           '   Returns   ID   sector   for   ATAPI.
Private Const IDE_ID_FUNCTION       As Long = &HEC           '   Returns   ID   sector   for   ATA.
Private Const IDE_EXECUTE_SMART_FUNCTION       As Long = &HB0           '   Performs   SMART   cmd.
Private Type DRIVERSTATUS
        bReserved(1)   As Byte                 '   Reserved   for   future   expansion.
        dwReserved(1)   As Long               '   Reserved   for   future   expansion.
End Type

Private Type SENDCMDOUTPARAMS
        cBufferSize   As Long                   '   Size   of   bBuffer   in   bytes
        drvStatus   As DRIVERSTATUS       '   Driver   status   structure.
        bBuffer(0)   As Byte                     '   Buffer   of   arbitrary   length   in   which   to   store   the   data   read   from   the                                                                                     '   drive.
End Type


Private Type ATTRTHRESHOLD
        bAttrID   As Byte                           '   Identifies   which   attribute
        bWarrantyThreshold   As Byte     '   Triggering   value
        bReserved(9)   As Byte               '
End Type

Private Type IDSECTOR
        wGenConfig   As Integer
        wNumCyls   As Integer
        wReserved   As Integer
        wNumHeads   As Integer
        wBytesPerTrack   As Integer
        wBytesPerSector   As Integer
        wSectorsPerTrack   As Integer
        wVendorUnique(2)   As Integer
        sSerialNumber(19)   As Byte
        wBufferType   As Integer
        sFirmwareRev(7)   As Byte
        sModelNumber(39)   As Byte
End Type

Private Const VER_PLATFORM_WIN32s As Long = 0
Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
Private Const VER_PLATFORM_WIN32_NT As Long = 2
Private Type OSVERSIONINFO
        dwOSVersionInfoSize   As Long
        dwMajorVersion   As Long
        dwMinorVersion   As Long
        dwBuildNumber   As Long
        dwPlatformId   As Long
        szCSDVersion   As String * 128                   '     Maintenance   string   for   PSS   usage
End Type

Private Declare Function GetVersionEx Lib "KERNEL32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Const GENERIC_READ       As Long = &H80000000
Private Const GENERIC_WRITE       As Long = &H40000000
Private Const OPEN_EXISTING         As Long = 3
Private Declare Function CreateFile Lib "KERNEL32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function DeviceIoControl Lib "KERNEL32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long
Private m_DiskInfo As IDSECTOR

Private Function OpenSMART(ByVal nDrive As Byte) As Long
      Dim hSMARTIOCTL&, hd$
      Dim VersionInfo     As OSVERSIONINFO
      VersionInfo.dwOSVersionInfoSize = Len(VersionInfo)
      GetVersionEx VersionInfo
      Select Case VersionInfo.dwPlatformId
            Case VER_PLATFORM_WIN32s
                  OpenSMART = hSMARTIOCTL
            Case VER_PLATFORM_WIN32_WINDOWS
                  hSMARTIOCTL = CreateFile("//./SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0)
            Case VER_PLATFORM_WIN32_NT
                  If nDrive < MAX_IDE_DRIVES Then
                        hd = "//./PhysicalDrive" & nDrive
                        hSMARTIOCTL = CreateFile(hd, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
                  End If
      End Select
      OpenSMART = hSMARTIOCTL
End Function

Private Function DoIDENTIFY(ByVal hSMARTIOCTL As Long, pSCIP As SENDCMDINPARAMS, pSCOP() As Byte, ByVal bIDCmd As Byte, ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
      pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)
      pSCIP.irDriveRegs.bCommandReg = bIDCmd
      pSCIP.bDriveNumber = bDriveNum
      DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))
End Function

Public Function GetDiskInfo(ByVal nDrive As Byte) As Long
      Dim hSMARTIOCTL&, cbBytesReturned&
      Dim VersionParams     As GETVERSIONOUTPARAMS
      Dim scip     As SENDCMDINPARAMS
      Dim scop()     As Byte
      Dim OutCmd     As SENDCMDOUTPARAMS
      Dim bDfpDriveMap     As Byte
      Dim bIDCmd     As Byte                                           '   IDE   or   ATAPI   IDENTIFY   cmd
      Dim uDisk     As IDSECTOR
      m_DiskInfo = uDisk
      hSMARTIOCTL = OpenSMART(nDrive)
      If hSMARTIOCTL <> INVALID_HANDLE_VALUE Then
            Call DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION, ByVal 0, 0, VersionParams, Len(VersionParams), cbBytesReturned, 0)
            bIDCmd = IIf((VersionParams.bIDEDeviceMap / 2 ^ nDrive And &H10), IDE_ATAPI_ID, IDE_ID_FUNCTION)
            ReDim scop(LenB(OutCmd) + IDENTIFY_BUFFER_SIZE - 1) As Byte
            If DoIDENTIFY(hSMARTIOCTL, scip, scop, bIDCmd, nDrive, cbBytesReturned) Then
                  CopyMemory m_DiskInfo, scop(LenB(OutCmd) - 4), LenB(m_DiskInfo)
                  CloseHandle hSMARTIOCTL
                  GetDiskInfo = 1
                  Exit Function
            End If
            CloseHandle hSMARTIOCTL
            GetDiskInfo = 0
      End If
End Function

Public Function GetHDlist() As String
      If GetDiskInfo(0) = 1 Then
            GetHDlist = "硬碟物理系列號:" & Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode))
            'GetHDlist = "硬碟型號:" & StrConv(m_DiskInfo.sModelNumber, vbUnicode)
      Else
        GetHDlist = "讀取錯誤"
      End If
End Function

Private Sub Command1_Click()
MsgBox GetHDlist()
End Sub

邏輯盤序列號:


 
 Private Declare Function GetVolumeInformation& Lib "KERNEL32" _
  Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
  ByVal pVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
  lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _
  lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _
  ByVal nFileSystemNameSize As Long)
  Private Const MAX_FILENAME_LEN = 256


  Public Function DriveSerial(ByVal sDrv As String) As Long
    Dim RetVal     As Long
    Dim str     As String * MAX_FILENAME_LEN
    Dim str2     As String * MAX_FILENAME_LEN
    Dim a     As Long
    Dim b     As Long
    GetVolumeInformation sDrv & ":/", str, MAX_FILENAME_LEN, RetVal, _
    a, b, str2, MAX_FILENAME_LEN
    DriveSerial = RetVal
  End Function

Private Sub Command1_Click()
    Dim mCode As Long
     mCode = DriveSerial("C")
     machine.Text = "c:" & mCode & " "
     machine.Text = machine.Text & "d:" & DriveSerial("D")
End Sub