17

如何获取 PC 中 CPU 的序列号?

4

13 回答 13

16

在没有任何外部库的情况下,我对此有最终的答案。只需输入:

wmic bios获取序列号

这将为您提供 PC 机箱上的序列号;)(在微软的知识库中找到)

问候!

于 2010-01-27T22:25:10.067 回答
6

请记住,如今大多数计算机出厂时都在 BIOS 中禁用了 CPU ID。参见维基百科上的 CPUID

于 2008-09-18T06:41:01.537 回答
3

Intel CPU 中 Pentium III 之后没有 CPU 序列号(PSN;CPUID edx bit 18 "psn" Processor Serial Number);AMD芯片中从来没有任何psn:

https://software.intel.com/en-us/forums/watercooler-catchall/topic/308483(2005 年)

但是,请记住,只有 Pentium III Xeon、Mobile Pentium III 和 Pentium III 处理器支持 Pentium III 处理器引入的处理器序列号功能。没有其他英特尔处理器支持处理器序列号功能

https://en.wikipedia.org/wiki/Pentium_III#Controversy_about_privacy_issues

https://en.wikipedia.org/wiki/CPUID#EAX=3:_Processor_Serial_Number

EAX=3:处理器序列号 另见:Pentium III § 关于隐私问题的争议

这将返回处理器的序列号。处理器序列号是在 Intel Pentium III 上引入的,但出于隐私考虑,以后的型号上不再实现此功能(PSN 功能位始终被清除)。Transmeta 的 Efficeon 和 Crusoe 处理器也提供此功能。但是,AMD CPU 不会在任何 CPU 型号中实现此功能。

于 2018-01-05T13:18:52.273 回答
2

这是旧线程。但是我遇到了同样的问题,但是我得到了以下逻辑,没有太多的 if、ands 或 buts。

CPU序列号的问题在于它并不总是在虚拟化环境中工作。

我使用一组基于 Windows 的服务器执行了以下逻辑:

Win32_BIOS可以为您提供bios的序列号。我们需要记住,如果系统是虚拟化的,您最终可能会为所有服务器获得相同的 bios 序列号。

Win32_NetworkAdapter可以为您提供一个您也可以使用的 MAC。在您有多个 NIC 的情况下,您最终会得到多个 MAC。

结合这两个 ID,我拥有一组跨越物理和虚拟的 6000 台服务器的所有唯一集。ManagementClass使用&实现这非常简单ManagementObject

但请注意:当您尝试MO远程获取实例时,在延迟小于 5 毫秒的 10Gbps 光网络上将需要几秒钟以上的时间。因此,如果您进行数学计算,我在单线程操作上花费了 3 多个小时。由于这更像是一个低优先级的流量,我不想向我的网络发送垃圾邮件以收集WMI多线程调用的数据。

于 2012-04-15T07:55:57.153 回答
2

即使启用了 CPUID,现代处理器中实际上是否有可用的序列号?我记得在 Pentium 的 3 天里,当整个序列号问题被提出时,引起了很大的抗议。

于 2008-09-18T06:43:19.597 回答
2

Ivy Bridge CPU 和更新的 CPU 都包含 PPIN(受保护的处理器标识号)。计算机的固件可能会阻止访问此功能。

https://lore.kernel.org/patchwork/patch/736614/

于 2018-10-11T21:20:37.260 回答
1

__get_cpuid (unsigned int __level, unsigned int *__eax, unsigned int *__ebx, unsigned int *__ecx, unsigned int *__edx);

  • 标题:#include <cpuid.h>

注意:处理器序列号是在 Intel Pentium III 上引入的,但出于隐私考虑,此功能不再在以后的型号上实现。

来源:维基百科

于 2016-03-11T16:25:51.393 回答
1

使用正确的寄存器设置执行 CPUID 指令将检索 EAX、EBX、ECX 和 EDX 中的处理器序列号。但是,此功能仅在 Pentium 3 和更高版本的处理器上可用。同样在 Pentium 4 和更新的处理器上,该指令总是在所有 4 个寄存器中返回 0x00000000。后来的型号 Pentium 3 也可能返回 0x00000000。该功能主要针对复制保护,允许将软件链接到特定处理器。它在社区中没有得到很好的解决,随之而来的是诉讼。该功能已从最新型号 P3 和所有较新的处理器中删除。出于兼容性原因,该功能存在于较新的处理器中。有传言说你可以特别订购带有序列号的处理器,btu 最低购买量大约是 100 万个处理器。

还 -


#include <Windows.h>
#include <stdio.h>
#include <xmmintrin.h>
#include <iphlpapi.h>
#include <Rpc.h>

static void GetMACaddress(void);
static void uuidGetMACaddress(void);

int main(){
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    printf("Processors - %d\n" , SysInfo.dwNumberOfProcessors);
    DWORD a , b , c , d , e;
    DWORD BasicLeaves;
    char* VendorID = (char*)malloc(20);
    char* message = (char*)malloc(20);
    _asm {
        pusha
        pushfd
        pop eax
        push eax
        xor eax , 0x00200000
        push eax
        popfd
        pushfd
        pop ecx
        pop eax
        xor eax , ecx
        mov [a] , eax
        }
    if(a & 0x00200000){
        printf("CPUID opcode supported.\n");
        } else {
        printf("CPUID opcode not supported, exiting...\n");
        return 0;
        }

    //DWORD* pa = &a[0];
    //DWORD* pb = &a[1];
    //DWORD* pc = &a[2];
    //DWORD* pd = &a[3];
    //a[4] = 0;
    e = 0;
    __asm {
        mov eax , 0
        cpuid
        mov [BasicLeaves] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }
    memcpy(&VendorID[0] , &b , 4);
    memcpy(&VendorID[4] , &d , 4);
    memcpy(&VendorID[8] , &c , 4);
    VendorID[12] = 0;

    printf("%d Basic Leaves\nVendorID - %s\n" , BasicLeaves , VendorID);

    __asm {
        mov eax , 1
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }
    if(d & 0x00000001) printf("FPU\n");
    if(d & 0x00000200) printf("APIC On-Chip\n");
    if(d & 0x00040000) printf("Processor Serial Number Present\n");
    if(d & 0x00800000) printf("MMX\n");
    if(d & 0x01000000) printf("SSE\n");
    if(d & 0x02000000) printf("SSE2\n");
    if(d & 0x08000000) printf("Hyperthreading (HTT)\n");

    if(c & 0x00000001) printf("SSE3\n");
    if(c & 0x00000200) printf("SSSE3\n");
    if(c & 0x00080000) printf("SSE4.1\n");
    if(c & 0x00100000) printf("SSE4.2\n");
    if(c & 0x02000000) printf("AES\n");


    __asm {
        mov eax , 0x80000000
        cpuid
        and eax , 0x7fffffff;
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }

    printf("%d Extended Leaves\n" , a);

    printf("Processor Brand String - ");
    __asm {
        mov eax , 0x80000002
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }
    memcpy(&message[0] , &a , 4);
    memcpy(&message[4] , &b , 4);
    memcpy(&message[8] , &c , 4);
    memcpy(&message[12] , &d , 4);
    message[16] = 0;
    printf("%s" , message);

    __asm {
        mov eax , 0x80000003
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }

    memcpy(&message[0] , &a , 4);
    memcpy(&message[4] , &b , 4);
    memcpy(&message[8] , &c , 4);
    memcpy(&message[12] , &d , 4);
    message[16] = 0;
    printf("%s" , message);

    __asm {
        mov eax , 0x80000004
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        popa
        }
    memcpy(&message[0] , &a , 4);
    memcpy(&message[4] , &b , 4);
    memcpy(&message[8] , &c , 4);
    memcpy(&message[12] , &d , 4);
    message[16] = 0;
    printf("%s\n" , message);

    char VolumeName[256]; DWORD VolumeSerialNumber; DWORD MaxComponentLength; DWORD FileSystemFlags; char FileSystemNameBuffer[256]; 
    GetVolumeInformationA("c:\\" , VolumeName , 256 , &VolumeSerialNumber , &MaxComponentLength , &FileSystemFlags , (LPSTR)&FileSystemNameBuffer , 256);
    printf("Serialnumber - %X\n" , VolumeSerialNumber);

    GetMACaddress();
    uuidGetMACaddress();

    return 0;
    }

// Fetches the MAC address and prints it
static void GetMACaddress(void){
    IP_ADAPTER_INFO AdapterInfo[16];        // Allocate information 
                                            // for up to 16 NICs
    DWORD dwBufLen = sizeof(AdapterInfo);   // Save memory size of buffer

    DWORD dwStatus = GetAdaptersInfo(       // Call GetAdapterInfo
    AdapterInfo,                            // [out] buffer to receive data
    &dwBufLen);                             // [in] size of receive data buffer
    //assert(dwStatus == ERROR_SUCCESS);    // Verify return value is 
                                            // valid, no buffer overflow

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to
                                            // current adapter info
    do {
        printf("Adapter MAC Address - %X-%X-%X-%X-%X-%X\n" , pAdapterInfo->Address[0] , pAdapterInfo->Address[1] , pAdapterInfo->Address[2] , pAdapterInfo->Address[3] , pAdapterInfo->Address[4] , pAdapterInfo->Address[5]);
        printf("Adapter IP Address  - %s\n" , pAdapterInfo->CurrentIpAddress);
        printf("Adapter Type        - %d\n" , pAdapterInfo->Type);
        printf("Adapter Name        - %s\n" , pAdapterInfo->AdapterName);
        printf("Adapter Description - %s\n" , pAdapterInfo->Description);
        uuidGetMACaddress();

        printf("\n");
        //PrintMACaddress(pAdapterInfo->Address); // Print MAC address
        pAdapterInfo = pAdapterInfo->Next;      // Progress through 
                                                // linked list
        } while(pAdapterInfo);                  // Terminate if last adapter
    }

// Fetches the MAC address and prints it

static void uuidGetMACaddress(void)
{
  unsigned char MACData[6];

  UUID uuid;
  UuidCreateSequential( &uuid );    // Ask OS to create UUID

  for (int i=2; i<8; i++)  // Bytes 2 through 7 inclusive 
                           // are MAC address
    MACData[i - 2] = uuid.Data4[i];

  printf("UUID MAC Address - %X-%X-%X-%X-%X-%X\n" , MACData[0] , MACData[1] , MACData[2] , MACData[3] , MACData[4] , MACData[5]);
}//*/
于 2019-05-02T03:58:36.337 回答
0

使用 CPUZ 工具:http ://www.cpuid.com/cpuz.php

于 2008-09-18T06:18:25.553 回答
0

请提供更多详细信息:操作系统,语言。

例如,在 Windows 上,您可以通过使用 WMI 并读取Win32_Processor.ProcessorId来获取它。

于 2008-09-18T06:26:08.220 回答
0

在 windows 中,我确信有一个系统调用,在 linux 中可以尝试“sudo lshw”,但大多数内核似乎不支持 CPU 序列号,初步研究似乎表明,对唯一可识别计算机的普遍愤怒意味着存在没有完美的答案。

你想做什么?几乎可以肯定有人以前做过,重用或模仿他们所做的可能是明智的。

于 2008-09-18T06:46:42.600 回答
-1

您可以使用CPUID命令。

于 2008-09-18T06:17:37.583 回答
-1

我猜相当多的编译器确实围绕上述命令提供了一些包装器等。这是一个例子

#include <stdlib.h>
#include <string.h>
#include <intrinsics.h>

_CPUID cpuinfo;
int main(void) {
_cpuid(&cpuinfo);
printf("Vendor: %s\n", cpuinfo.Vendor);
return 0;
}

输出:

Vendor: GenuineIntel
于 2008-09-18T06:30:25.947 回答