2017-04-14 227 views
-1

我试图从我的PC上获取硬盘和主板序列号。它适用于Windows 7及以上版本从PC获取唯一的硬件ID

但是,CMD中的相同代码不适用于Windows XP。它显示OEM来填充或返回无

wmic diskdrive get name,serialnumber,model // This is cmd to get serial num 

在Windows XP中返回错误的SERIALNUMBER

wmic baseboard get product,Manufacturer,version,serialnumber // This is cmd to get MotherBoard serialnumber 

在Windows XP和Win 8也回报在SERIALNUMBER错误,如“要填写通过OEM

我正在寻找最佳个人电脑唯一身份证,它可以返回任何操作系统的ID或序列号,应该是唯一的..

请帮帮我

谢谢。

+0

你需要什么?这是用于许可功能,还是仅仅是一个唯一的客户端ID?是否需要在操作系统升级或擦除时保持一致?它需要防篡改吗? –

回答

2

我发现了一个小项目在网上,他们得到:

  • 处理器ID
  • 主板ID
  • 卷序列号
  • MAC地址ID

然后,他们散列它通过MD5但它现在被折旧,所以最好的办法是做同样的事情,并散列它通过^ h SHA512

首先,您需要导入和参考,如果没有自动完成:

Imports System.Management 
Imports System.Security.Cryptography 
Imports System.Text 

然后函数获得HWID(硬件ID)

Public Function Get_HWID() As String 
    'Information Handler 
    Dim hw As New clsComputerInfo 
    'Decalre variables 
    Dim hdd, cpu, mb, mac As String 
    'Get all the values 
    cpu = hw.GetProcessorId() 
    hdd = hw.GetVolumeSerial("C") 
    mb = hw.GetMotherBoardID() 
    mac = hw.GetMACAddress() 
    'Generate the hash 
    Dim hwid As String = GenerateSHA512String(cpu & hdd & mb & mac) 
    Return hwid 
End Function 

函数生成散列:

Public Shared Function GenerateSHA512String(ByVal inputString) As String 
    Dim sha512 As SHA512 = SHA512Managed.Create() 
    Dim bytes As Byte() = Encoding.UTF8.GetBytes(inputString) 
    Dim hash As Byte() = sha512.ComputeHash(bytes) 
    Dim stringBuilder As New StringBuilder() 
    For i As Integer = 0 To hash.Length - 1 
     stringBuilder.Append(hash(i).ToString("X2")) 
    Next 
    Return stringBuilder.ToString() 
End Function 

最后Class获取信息息:

Public Class clsComputerInfo 
    Friend Function GetProcessorId() As String 
     Dim strProcessorId As String = String.Empty 
     Dim query As New SelectQuery("Win32_processor") 
     Dim search As New ManagementObjectSearcher(query) 
     Dim info As ManagementObject 
     For Each info In search.Get() 
      strProcessorId = info("processorId").ToString() 
     Next 
     Return strProcessorId 
    End Function 
    Friend Function GetMACAddress() As String 
     Dim mc As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration") 
     Dim moc As ManagementObjectCollection = mc.GetInstances() 
     Dim MACAddress As String = String.Empty 
     For Each mo As ManagementObject In moc 
      If (MACAddress.Equals(String.Empty)) Then 
       If CBool(mo("IPEnabled")) Then MACAddress = mo("MacAddress").ToString() 
       mo.Dispose() 
      End If 
      MACAddress = MACAddress.Replace(":", String.Empty) 
     Next 
     Return MACAddress 
    End Function 
    Friend Function GetVolumeSerial(Optional ByVal strDriveLetter As String = "C") As String 
     Dim disk As ManagementObject = New ManagementObject(String.Format("win32_logicaldisk.deviceid=""{0}:""", strDriveLetter)) 
     disk.Get() 
     Return disk("VolumeSerialNumber").ToString() 
    End Function 
    Friend Function GetMotherBoardID() As String 
     Dim strMotherBoardID As String = String.Empty 
     Dim query As New SelectQuery("Win32_BaseBoard") 
     Dim search As New ManagementObjectSearcher(query) 
     Dim info As ManagementObject 
     For Each info In search.Get() 
      strMotherBoardID = info("SerialNumber").ToString() 
     Next 
     Return strMotherBoardID 
    End Function 
End Class 

我回顾this project

希望的代码,这可以帮助你,请记得添加引用管理

更多信息:

最常见的ID用于HWID的是:CPU IDMAC addre基于SS的硬件ID和硬盘序列号

HWID不建议作为一个发牌系统,因为它是不准确的和不实际的,如果用户改变计算机或格式建议它更使用的驱动器等证书系统或更复杂的认证。

+0

试过你的代码...处理器ID是在一些PC上是常见的.....所以它失败了,对于MAC地址PC需要网络适配器,所以它失败了,当我试图让主板serialnumber ........它不适用于win 8 –

+0

您是否添加了引用** ....并且您不明白我们将所有值合并为一个ID,因为没有计算机将这四个值相加在一起... 。我在Windows 8上,它工作正常。尝试了解代码而不是**复制粘贴** – Mederic

+0

我需要它的Windows XP ..让我试试并通知.... –