c++获取处理器ID

C++ get Processor ID

本文关键字:ID 处理器 获取 c++      更新时间:2023-10-16

这个线程没有问题。如何获得处理器和主板Id?

我想使用c++代码获得处理器ID,而不使用WMI或任何第三方库。

或计算机上唯一的任何东西。一个是以太网ID,但在某些机器上也是可移动的。我想将其主要用于许可目的。

处理器ID是否唯一且在所有主要处理器上可用?

我最近遇到了一个类似的问题,我做了下面的事情。首先,我获得了一些唯一的系统标识值:

  • GetVolumeInformation for HDD序列号

  • GetComputerName(这当然不是唯一的,但是我们的系统使用计算机名称来识别局域网中的客户端,所以它对我很好)

  • __cpuid(特别是PSN -处理器序列号字段)

  • GetAdaptersInfo for MAC地址

我将这些值以一种任意但确定的方式组合在一起(阅读下面的更新!)(加,除,除和保留余数等)。就像对字符串一样对值进行迭代,并发挥创造性。最后,您将得到一个字节字面值,您可以将其转换为ASCII范围的字母和数字,以获得一个独特的,"可读"的代码,看起来不像噪音。

另一种方法可以简单地将这些值连接起来,然后在它们上面加上一些东西(可能再次转换为字母)来"覆盖它们"。

我说它是唯一的,因为至少一个输入应该是唯一的(MAC地址)。当然,你需要对数论有所了解,才能不破坏这种唯一性,但无论如何,它应该足够好了。

重要更新:自从这篇文章以来,我学到了一些关于密码学的东西,我认为任意组合(本质上是你自己的哈希)几乎肯定是一个坏主意。在实践中使用的哈希函数被构造为行为良好(如低碰撞概率)并且难以破坏(构造与另一个具有相同哈希值的值的能力)。构造这样一个函数是一个非常困难的计算机科学问题,除非你有资格,否则你不应该尝试。正确的方法是将您可以收集的有关硬件的任何信息(即我在帖子中列出的信息)连接起来,并使用加密散列或数字签名来获得可验证和安全的输出。也不要自己实现加密算法;有很多漏洞陷阱需要很多知识才能避免。使用知名且可信的库来实现算法。

如果您正在使用Visual Studio, Microsoft在<intrin.h>头文件中提供了内在的__cpuid。示例:链接的msdn站点

嗯…

有一些特殊的库可以根据所安装的硬件生成唯一的ID(所以对于指定的计算机,这个ID总是相同的)。大多数是主板ID +硬盘ID + CPU ID,并混合这些值。

什么时候重新发明轮子?为什么不使用这些库呢?有什么严肃的理由吗?

可以使用命令行。

wmic cpu list full
wmic baseboard list full

或WMI接口

#include <wmi.hpp>
#include <wmiexception.hpp>
#include <wmiresult.hpp>
#include <../src/wmi.cpp>
#include <../src/wmiresult.cpp> // used
#pragma comment(lib, "wbemuuid.lib")
struct Win32_WmiCpu
{
    void setProperties(const WmiResult& result, std::size_t index)
    {
        //EXAMPLE EXTRACTING PROPERTY TO CLASS
        result.extract(index, "ProcessorId", (*this).m_cpuID);
    }
    static std::string getWmiClassName()
    {
        return "Win32_Processor";
    }
    string m_cpuID;
    //All the other properties you wish to read from WMI
}; //end struct Win32_ComputerSystem
   
struct Win32_WmiMotherBoard
{
    void setProperties(const WmiResult& result, std::size_t index)
    {
        //EXAMPLE EXTRACTING PROPERTY TO CLASS
        result.extract(index, "SerialNumber", (*this).m_mBId);
    }
    static std::string getWmiClassName()
    {
        return "Win32_BaseBoard";
    }
    string m_mBId;
}; //end struct Win32_ComputerSystem

try
{
    const Win32_WmiCpu cpu = Wmi::retrieveWmi<Win32_WmiCpu>();
    strncpy_s(ret.m_cpu, cpu.m_cpuID.c_str(), _TRUNCATE);
}
catch (const Wmi::WmiException& )
{
}
try
{
    const Win32_WmiMotherBoard mb = Wmi::retrieveWmi<Win32_WmiMotherBoard>();
    strncpy_s(ret.m_mb, mb.m_mBId.c_str(), _TRUNCATE);
}
catch (const Wmi::WmiException& )
{
}