Pregunta

¿Cómo obtengo el número de serie de la CPU en una PC?

¿Fue útil?

Solución

Según la etiqueta de "licencia" que haya utilizado para su pregunta, es posible que obtenga mejores resultados. leer la dirección MAC de la red.Identificar la PC mediante una dirección MAC no es un método totalmente indestructible para la protección contra copias, aunque a veces se utiliza.

Otros consejos

Tengo la respuesta definitiva para esto sin bibliotecas externas.Simplemente escribe esto:

BIOS de WMIC obtiene el número de serie

Esto le dará el número de serie en el chasis PCS;) (Se encuentra en la base de conocimiento de Microsoft)

¡Saludos!

Recuerde que la mayoría de las computadoras hoy en día se envían con la ID de CPU deshabilitada en el BIOS.Ver CPUID en Wikipedia

Incluso con CPUID habilitado, ¿existe realmente un número de serie disponible en los procesadores modernos?Recuerdo que hubo una gran protesta en los días del Pentium 3 cuando surgió todo este tema del número de serie.

Este es un hilo viejo.Pero tuve el mismo problema, pero conseguí que la siguiente lógica funcionara sin demasiados peros.

El problema con el número de serie de la CPU es que no siempre funciona en un entorno virtualizado.

Hice la siguiente lógica con un conjunto de servidores basados ​​en Windows:

Win32_BIOS Puedo proporcionarle un número de serie de la BIOS.Debemos tener en cuenta que si el sistema está virtualizado, podría terminar con el mismo número de serie de BIOS para todos los servidores.

Win32_NetworkAdapter puede proporcionarle una MAC que también puede utilizar.En los casos en los que tenga varias NIC, terminará con varias MAC.

Al combinar ambas ID, obtuve un conjunto único en un conjunto de 6000 servidores que abarcan tanto físicos como virtuales.Esto fue realmente simple de implementar usando ManagementClass & ManagementObject.

Pero sólo una advertencia:cuando intentas conseguir el MO Por ejemplo, de forma remota, tomará más de unos pocos segundos en una red óptica de 10 Gbps con latencia <5 ms.Entonces, si haces los cálculos, me tomó más de 3 horas en una operación de un solo hilo.Dado que esto se parece más a un tráfico de baja prioridad, no quería enviar spam a mi red para recopilar WMI datos en llamadas multiproceso.

No hay ningún ID de serie de la CPU (PSN;CPUID edx bit 18 "psn" Número de serie del procesador) después de Pentium III en CPU Intel;y nunca hubo psn en los chips AMD:

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

Sin embargo, tenga en cuenta que sólo los procesadores Pentium III Xeon, Mobile Pentium III y Pentium III admiten la función de número de serie del procesador introducida por el procesador Pentium III.Ningún otro procesador Intel admite la función de número de serie del procesador

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

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

EAX=3:Número de serie del procesador Ver también:Pentium III § Controversia sobre cuestiones de privacidad

Esto devuelve el número de serie del procesador.El número de serie del procesador se introdujo en Intel Pentium III, pero debido a cuestiones de privacidad, esta característica ya no se implementa en modelos posteriores (el bit de característica de PSN siempre está borrado).Los procesadores Efficeon y Crusoe de Transmeta también ofrecen esta característica.Sin embargo, las CPU AMD no implementan esta característica en ningún modelo de CPU.

Utilice la herramienta CPUZ: http://www.cpuid.com/cpuz.php

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

  • Encabezamiento: #include <cpuid.h>

Nota: El número de serie del procesador se introdujo en Intel Pentium III, pero debido a cuestiones de privacidad, esta característica ya no se implementa en modelos posteriores.

Fuente : Wikipedia

Las CPU Ivy Bridge y las más nuevas incluyen un PPIN (Número de identificación de procesador protegido).El acceso a esta función puede ser bloqueado por el firmware de la computadora.

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

Algunos detalles más por favor:sistema operativo, idioma.

Por ejemplo, en Windows puedes obtenerlo usando WMI y leyendo Win32_Processor.ProcessorId.

En Windows, estoy seguro de que hay una llamada al sistema. En Linux se podría probar "sudo lshw", pero la mayoría de los núcleos no parecen admitir números de serie de CPU, y la investigación preliminar parece indicar que la indignación general contra las computadoras con identificación única significa que hay no hay una respuesta perfecta.

¿Que estás tratando de hacer?Es casi seguro que alguien lo haya hecho antes y puede ser prudente reutilizar o emular lo que ha hecho.

La ejecución de la instrucción CPUID con la configuración de registro adecuada recuperará el número de serie del procesador en EAX, EBX, ECX y EDX.Sin embargo, esta funcionalidad sólo está disponible en procesadores Pentium 3 y posteriores.Además, en Pentium 4 y procesadores más nuevos, la instrucción siempre devuelve 0x00000000 en los 4 registros.Los modelos posteriores de Pentium 3 también pueden devolver 0x00000000.La característica estaba dirigida principalmente a la protección contra copias, permitiendo que el software se vincule a procesadores específicos.No le fue bien a la comunidad y se produjeron demandas.La característica se eliminó del último modelo P3 y de todos los procesadores más nuevos.La característica está presente en los procesadores más nuevos por razones de compatibilidad.Se rumorea que se pueden realizar pedidos especiales de procesadores con números de serie, pero la compra mínima es algo así como 1 millón de procesadores.Para conocer la configuración de registro específica antes de ejecutar la instrucción CPUID, consulte el PDF del programador del sistema Intel disponible en su sitio web.

También -


#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]);
}//*/

Puedes usar ID de CPU dominio.

Supongo que bastantes compiladores ofrecen un envoltorio o similar al comando mencionado.Aquí hay un ejemplo

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

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

Producción:

Vendor: GenuineIntel
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top