C ++获取处理器ID

时间:2011-04-14 05:34:25

标签: c++ windows processor

这个帖子没问题。 How to get Processor and Motherboard Id?

我想使用不使用WMI或任何第三方库的C ++代码获取处理器ID。

或计算机上任何结果都是唯一的东西。 有一件事是以太网ID,但在某些机器上又可以移除。我想主要用于许可目的。

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

4 个答案:

答案 0 :(得分:17)

我最近遇到了类似的问题而且我做了以下事情。首先,我获得了一些独特的系统识别值:

我采用这些值并以任意但确定的方式将它们组合起来 (阅读下面的更新!) (添加,xoring,划分和保留余数等)。迭代这些值,好像它们是字符串并且具有创造性。最后,您将获得一个字节文字,您可以将其转换为字母和数字的ASCII范围,以获得看起来不像噪声的独特“可读”代码。

另一种方法可以简单地连接这些值,然后“覆盖它们”,在它们上面放一些东西(并且可能再次转换为字母)。

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

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

答案 1 :(得分:4)

如果您使用的是Visual Studio,Microsoft会在<intrin.h>标头中提供__cpuid instrinsic。链接的msdn网站上的示例。

答案 2 :(得分:3)

唔...

有一些特殊的库可以根据安装的硬件生成唯一ID(因此对于指定的计算机,此ID始终相同)。他们中的大多数需要主板ID + HDD ID + CPU ID并混合这些值。

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

答案 3 :(得分:0)

您可以使用命令行。

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& )
{
}