【问题标题】:Get unique Hardware id from PC从 PC 获取唯一的硬件 ID
【发布时间】:2020-12-05 16:49:52
【问题描述】:

我尝试从我的 PC 获取硬盘和主板序列号。它在 Windows 7 及更高版本中运行良好

但 CMD 中的相同代码不适用于 Windows XP。它显示 O.E.M 被填充或不返回任何内容

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

在 Windows XP 中返回序列号错误

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

在 Windows XP 和 Win 8 中,它返回序列号错误,如“由 OEM 填写

我正在寻找 Best Pc Unique Id ,它可以返回任何操作系统的 id 或序列号,并且应该是唯一的..

请帮帮我

谢谢。

【问题讨论】:

  • 你需要它做什么?这是为了许可功能,还是只是一个唯一的客户 ID?它是否需要在操作系统升级或擦除之间保持一致?是否需要防篡改?

标签: vb.net cmd command-prompt vb.net-2010


【解决方案1】:

我在网上找到了一个小项目:

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

然后他们通过 MD5 对其进行哈希处理,但它现在已贬值,因此最好的办法是做同样的事情并通过 Sha512

对其进行哈希处理

如果没有自动完成,首先你需要导入和引用:

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

然后函数获取HWID(HardwareID)

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的代码

希望这可以帮助您,请记住添加对管理

的引用

更多信息:

用于 HWID 的最常见 ID 是:CPU ID基于 MAC 地址的硬件 ID硬盘序列号

不建议将 HWID 作为许可系统,因为如果用户更改计算机或格式化驱动器等,它不准确且不实用。更建议使用证书系统或更复杂的身份验证。

【讨论】:

  • 试过你的代码......处理器ID在某些PC上很常见......所以它失败了,对于mac地址PC需要网络适配器,所以它失败了,当我尝试获取主板序列号时。 .......它不适用于win 8
  • 您是否添加了引用....您不明白这里我们将所有值合并到一个 ID 中,因为没有计算机会将这 4 个值加在一起同样....我在Windows 8上,它工作正常。尝试理解代码而不是复制粘贴
  • 您是否尝试通过 XP 支持的框架以低于 4.5 的框架运行您的应用程序...最大 XP 支持是 4.0,有些不高于 3.5
  • 那个唯一的ID不应该改变老兄......如果我格式化系统C:卷序列号会改变......所以下次代码可能会改变......所以如果我结合了所有这些序列号.... c:卷序列号值可能会在格式化时更改,并且下次可能会更改整个 hwid....
  • @ramnainar 你实际上可以从 XP 中的主板获得很多信息:Video to teach you 此外,大多数软件公司不使用 HWID,因为它不可靠。最常用的 HWID 是:CPU ID基于 MAC 地址的硬件 ID硬盘序列号 您应该考虑创建一个适当的许可系统摇摇晃晃的东西。如果您没有网络汽车与服务器通信,为什么还要使用 HWID。
【解决方案2】:

记住Mac地址卷序列号是可以更改的。因此,硬件将发生不可预测的变化。
因此,请使用 处理器主板 ID,以便 硬件 ID 永远不会改变。
因此,在此基础上,您可以修改@Mederic 代码如下:

'Get the MotherBoard ID
    Function GetMotherBoardID() As String
        Dim query As New SelectQuery("Win32_BaseBoard")
        Dim search As New ManagementObjectSearcher(query)
        For Each info As ManagementObject In search.Get()
            Return info("SerialNumber").ToString()
        Next
    End Function

'Get the Processor ID 
    Function GetProcessorId() As String
        Dim query As New SelectQuery("Win32_processor")
        Dim search As New ManagementObjectSearcher(query)
        Dim info As ManagementObject
        For Each info In search.Get()
            Return info("processorId").ToString()
        Next
    End Function

' Generate Hash  
    Function GenerateHash(ByVal input As String) As String
        Dim hash = New SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))
        Return String.Concat(hash.[Select](Function(b) b.ToString("x2")))
    End Function


'Now display Hardware ID
MessageBox.Show(GenerateHash(GetMotherBoardID() & GetProcessorId()))

源代码:Code fileBinary executable

处理器 ID 对所有计算机不是唯一的,但保持不变。 refernce
主板 ID 无法更改。 reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2011-11-24
    • 2011-04-07
    • 1970-01-01
    • 2013-05-27
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多