c++获取处理器ID
C++ get Processor ID
这个线程没有问题。如何获得处理器和主板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& )
{
}
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- C/C++预处理器是否可以检测一些编译器选项
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 从函数角度看ID到文件路径的内部与外部映射
- 通过组合不同的类型来创建唯一的id
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 不同/较旧的处理器运行c++代码的方式是否不同
- FFMPEG配置文件级别id大小无效
- 用于交叉编译和CMake的预处理器宏的单元测试
- 方法内部但循环仍得到预期的不合格id错误C++
- 如何获取 GLFW 窗口 ID?
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 其他人的代码似乎返回了不同的处理器 ID
- 如何在C或C 中获取主板地址或处理器ID /序列号
- c++获取处理器ID