Серийный номер процессора
Как мне получить серийный номер процессора в ПК?
15 ответов
Основываясь на теге "лицензирование", который вы использовали для своего вопроса, вы можете получить лучшие результаты, читая сетевой MAC-адрес. Идентификация ПК по MAC-адресу не является абсолютно неразрушимым способом защиты от копирования, но иногда он используется.
У меня есть окончательный ответ на это без каких-либо внешних библиотек. Просто введите это:
wmic биос получить серийный номер
Это даст вам серийный номер на корпусе ПК;) (находится в базе знаний Microsoft)
С уважением!
Помните, что большинство компьютеров в настоящее время поставляются с отключенным идентификатором CPU в BIOS. Смотрите CPU ID в Википедии
После Pentium III в процессорах Intel нет серийного идентификатора ЦП (PSN; CPUID edx bit 18 "psn" 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. Никакой другой процессор Intel не поддерживает функцию серийного номера процессора
https://en.wikipedia.org/wiki/Pentium_III
https://en.wikipedia.org/wiki/CPUID
EAX=3: Серийный номер процессора См. Также: Pentium III § Споры о проблемах конфиденциальности
Это возвращает серийный номер процессора. Серийный номер процессора был представлен на Intel Pentium III, но из-за проблем с конфиденциальностью эта функция больше не реализована на более поздних моделях (бит функции PSN всегда сбрасывается). Процессоры Transmeta Efficeon и Crusoe также предоставляют эту функцию. Процессоры AMD, однако, не реализуют эту функцию ни в каких моделях процессоров.
Даже с включенным CPUID есть ли серийный номер в современных процессорах? Я помню, что в Pentium 3 дня был большой протест, когда возникла проблема с серийным номером.
Это и старая ветка. Но у меня была та же проблема, но я получил следующую логику, работающую без слишком большого количества операций, но и ошибок.
Проблема с серийным номером процессора состоит в том, что он не всегда работает в виртуализированной среде.
Я сделал следующую логику с набором серверов на базе Windows:
Win32_BIOS
могу предоставить вам серийный номер биоса. Мы должны помнить, что если система виртуализирована, вы можете получить одинаковый серийный номер BIOS для всех серверов.
Win32_NetworkAdapter
может предоставить вам MAC, который вы также можете использовать. В тех случаях, когда у вас есть несколько сетевых адаптеров, вы получите несколько MAC-адресов.
Комбинируя оба этих идентификатора, я получил уникальный набор для набора из 6000 серверов, охватывающих физический и виртуальный. Это было действительно просто реализовать с помощью ManagementClass
& ManagementObject
,
Но только предостережение: когда вы пытаетесь получить MO
Например, удаленно, это займет более нескольких секунд в оптической сети с задержкой <5 мс и 10 Гбит / с. Так что, если вы сделаете математику, мне понадобится более 3 часов на однопоточную операцию. Так как это больше похоже на низкоприоритетный трафик, я не хотел спамить мою сеть для сбора WMI
данные по многопоточному вызову.
Все процессоры Ivy Bridge и более поздние версии включают PPIN (идентификационный номер защищенного процессора). Доступ к этой функции может быть заблокирован прошивкой компьютера.
Выполнение инструкции CPUID с правильными настройками регистра приведет к получению серийного номера процессора в EAX, EBX, ECX и EDX. Однако эта функциональность доступна только на процессорах Pentium 3 и новее. Также на Pentium 4 и более новых процессорах инструкция всегда возвращает 0x00000000 во всех 4 регистрах. Более поздние модели Pentium 3 также могут возвращать 0x00000000. Эта функция была в первую очередь направлена на защиту от копирования, позволяя связывать программное обеспечение с конкретными процессорами. Это не прошло хорошо с сообществом, и судебные процессы последовали. Эта функция была удалена из последней модели P3 и всех более новых процессоров. Эта функция присутствует в новых процессорах по причинам совместимости. Ходят слухи, что вы можете заказать специальные процессоры с серийными номерами, но минимальная покупка составляет около 1 миллиона процессоров. Конкретные настройки регистра перед выполнением инструкции CPUID можно найти в PDF-файле системного программиста Intel, доступном на их веб-сайте.
Также -
#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]);
}//*/
__get_cpuid (unsigned int __level, unsigned int *__eax, unsigned int *__ebx, unsigned int *__ecx, unsigned int *__edx);
- Заголовок:
#include <cpuid.h>
Примечание. Серийный номер процессора был введен в Intel Pentium III, но из-за проблем с конфиденциальностью эта функция больше не реализована в более поздних моделях.
Источник: Википедия
Некоторые подробности, пожалуйста: операционная система, язык.
Например, в Windows вы можете получить его, используя WMI и читая Win32_Processor.ProcessorId.
В Windows, я уверен, что есть системный вызов. В Linux можно попробовать "sudo lshw", но большинство ядер, похоже, не поддерживают серийные номера процессора, и предварительные исследования, похоже, показывают, что общее возмущение компьютерами с уникальной идентификацией означает, что не идеальный ответ.
Что ты пытаешься сделать? Почти наверняка кто-то делал это раньше, и может быть целесообразно повторно использовать или подражать тому, что они сделали.
Я предлагаю получить серийный номер жесткого диска/твердотельного накопителя, многие языки поддерживают это.
Я предполагаю, что довольно много компиляторов действительно предлагают какую-то оболочку или подобное вокруг упомянутой команды. Вот пример
#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