número de serie de la CPU
-
01-07-2019 - |
Pregunta
¿Cómo obtengo el número de serie de la CPU en una PC?
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.
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