簡體   English   中英

C++ 獲取處理器 ID

[英]C++ get Processor ID

這個線程沒問題。 如何獲取處理器和主板 ID?

我想使用 C++ 代碼而不使用 WMI 或任何第三方庫來獲取處理器 ID。

或者計算機上的任何東西都是獨一無二的。 一件事是以太網 ID,但它在某些機器上又是可移動的。 我想主要用於許可目的。

處理器 ID 是唯一的並且在所有主要處理器上都可用嗎?

我最近遇到了類似的問題,我做了以下事情。 首先,我獲得了一些獨特的系統識別值:

我將這些值以任意但確定性的方式組合起來(閱讀下面的更新!) (添加、異或、除和保留余數等)。 像字符串一樣迭代這些值並具有創造性。 最后,您將獲得一個字節文字,您可以將其轉換為字母和數字的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM