[英]C++ get Processor ID
這個線程沒問題。 如何獲取處理器和主板 ID?
我想使用 C++ 代碼而不使用 WMI 或任何第三方庫來獲取處理器 ID。
或者計算機上的任何東西都是獨一無二的。 一件事是以太網 ID,但它在某些機器上又是可移動的。 我想主要用於許可目的。
處理器 ID 是唯一的並且在所有主要處理器上都可用嗎?
我最近遇到了類似的問題,我做了以下事情。 首先,我獲得了一些獨特的系統識別值:
GetVolumeInformation硬盤序列號
GetComputerName (這當然不是唯一的,但我們的系統使用計算機名稱來識別 LAN 上的客戶端,所以這對我有好處)
__cpuid (特別是 PSN - 處理器序列號字段)
獲取 MAC 地址的適配器信息
我將這些值以任意但確定性的方式組合起來(閱讀下面的更新!) (添加、異或、除和保留余數等)。 像字符串一樣迭代這些值並具有創造性。 最后,您將獲得一個字節文字,您可以將其轉換為字母和數字的 ASCII 范圍,以獲得一個獨特的、“可讀”的、看起來不像噪音的代碼。
另一種方法可以簡單地連接這些值,然后通過對它們進行異或運算(並且可能再次轉換為字母)來“掩蓋它們”。
我是說它是唯一的,因為至少有一個輸入應該是唯一的(MAC 地址)。 當然,你需要對數論有一定的了解才能不破壞這種獨特性,但無論如何它應該足夠好。
重要更新:自從這篇文章以來,我學到了一些關於密碼學的知識,我認為組成一個任意組合(基本上是你自己的哈希)幾乎肯定是一個壞主意。 實踐中使用的散列函數被構造為表現良好(如碰撞概率低)並且難以破壞(能夠構造一個與另一個具有相同散列值的值)。 構建這樣一個函數是一個非常困難的計算機科學問題,除非你有資格,否則你不應該嘗試。 正確的方法是連接您可以收集的有關硬件的任何信息(即我在帖子中列出的信息),並使用加密哈希或數字簽名來獲得可驗證且安全的輸出。 也不要自己實現加密算法; 有許多漏洞陷阱需要大量知識才能避免。 使用知名且值得信賴的庫來實現算法。
如果您使用的是 Visual Studio,Microsoft 會在<intrin.h>
標頭中提供__cpuid
內在參數。 鏈接的 msdn 站點上的示例。
嗯...
有特殊的庫可以根據安裝的硬件生成唯一 ID(因此對於指定的計算機,此 ID 始終相同)。 它們中的大多數采用主板 ID + HDD 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& )
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.