Как мне получить серийный номер ЦП на ПК?
На этой странице есть отличный ответ. stackoverflow.com/questions/3474940/unique-computer-id/…





Вы можете использовать команду CPUID.
Используйте инструмент CPUZ: http://www.cpuid.com/cpuz.php
Поскольку это сайт программирования, я подозреваю, что он спрашивает, как программно получить серийный номер. Он использовал лицензионный тег, который подозревает, что он собирается использовать его для создания серийных номеров для своего приложения.
Еще немного подробностей: операционная система, язык.
Например, в Windows вы можете получить его, используя WMI и прочитав Win32_Processor.ProcessorId.
Да и ProcessorId - это какой-то (полу) уникальный идентификатор процессора.
Я думаю, довольно много компиляторов предлагают некоторую оболочку или что-то подобное вокруг упомянутого команда. Вот пример
#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
Это был пример intrincis, который, например, предлагает lcc-win32. Это не стандартно. И вам нужно выполнить линковку с соответствующими библиотеками.
Помните, что большинство компьютеров в наши дни поставляются с отключенным идентификатором процессора в BIOS. См. CPUID в Википедии
Даже с включенным CPUID есть ли серийный номер в современных процессорах? Я помню, что в дни Pentium 3 был большой резонанс, когда возникла проблема с серийным номером.
После Pentium III в процессорах Intel нет серийного идентификатора процессора (PSN) после Pentium III: software.intel.com/en-us/forums/watercooler-catchall/topic/… «Однако имейте в виду, что только процессоры Pentium III Xeon, Mobile Pentium III и Pentium III поддерживают функцию серийного номера процессора, введенную процессором Pentium III. Ни один другой процессор Intel не поддерживает функцию серийного номера процессора: «(в 2005 г.); en.wikipedia.org/wiki/…
Я уверен, что в Windows есть системный вызов. В Linux можно попробовать "sudo lshw", но большинство ядер, похоже, не поддерживают серийные номера ЦП, и предварительные исследования, похоже, указывают на то, что общее возмущение по поводу однозначно идентифицируемых компьютеров означает, что есть нет идеального ответа.
Что ты пытаешься сделать? Почти наверняка кто-то делал это раньше, и может быть целесообразно повторно использовать или подражать тому, что они сделали.
У меня есть окончательный ответ без каких-либо внешних библиотек. Просто введите это:
wmic bios получить серийный номер
Это даст вам серийный номер на корпусе ПК;) (можно найти в базе знаний Microsoft)
С Уважением!
вернул мне текст «Серийный номер системы» на моем i7. У вас есть ссылка на указанную статью базы знаний?
Текст «Серийный номер системы» типичен для систем белого ящика. Предполагается, что производитель ПК заменит его перед тем, как продать его.
С моей доской возвращается сообщение «Для заполнения O.E.M.» => ненадежно => вероятно, лучше использовать что-нибудь еще, например MAC-адрес, если он доступен.
Это и старая ветка. Но у меня была такая же проблема, но следующая логика работала без лишних «если», «и» или «но».
Проблема с серийным номером ЦП в том, что он не всегда работает в виртуализированной среде.
Я проделал следующую логику с набором серверов на базе Windows:
Win32_BIOS может предоставить вам серийный номер BIOS. Мы должны иметь в виду, что если система виртуализирована, вы можете получить один и тот же серийный номер BIOS для всех серверов.
Win32_NetworkAdapter может предоставить вам MAC, который вы также можете использовать. В случаях, когда у вас несколько сетевых адаптеров, вы получите несколько MAC.
Объединив оба этих идентификатора, я получил уникальный набор из 6000 серверов, как физических, так и виртуальных. Это было действительно просто реализовать с помощью ManagementClass и ManagementObject.
Но сделаю одно предостережение: когда вы попытаетесь получить экземпляр MO удаленно, это займет больше нескольких секунд в оптической сети 10 Гбит / с с задержкой <5 мс. Итак, если вы посчитаете, мне потребовалось более 3 часов на операцию одного потока. Поскольку это больше похоже на трафик с низким приоритетом, я не хотел спамить свою сеть для сбора данных WMI при многопоточном вызове.
__get_cpuid (unsigned int __level, unsigned int *__eax, unsigned int *__ebx, unsigned int *__ecx, unsigned int *__edx);
#include <cpuid.h>Примечание: Серийный номер процессора был введен в Intel Pentium III, но из соображений конфиденциальности эта функция больше не реализована в более поздних моделях.
Источник: википедия
Последовательный идентификатор процессора (PSN; CPUID edx bit 18 «psn» серийный номер процессора) после Pentium III в процессорах Intel отсутствует; и в чипах AMD никогда не было psn:
https://software.intel.com/en-us/forums/watercooler-catchall/topic/308483 (в 2005 г.)
However, keep in mind that only the Pentium III Xeon, Mobile Pentium III and Pentium III processors support the processor serial number feature introduced by the Pentium III processor. No other Intel processor supports the processor serial number feature
https://en.wikipedia.org/wiki/Pentium_III#Controversy_about_privacy_issues
https://en.wikipedia.org/wiki/CPUID#EAX=3:_Processor_Serial_Number
EAX=3: Processor Serial Number See also: Pentium III § Controversy about privacy issues
This returns the processor's serial number. The processor serial number was introduced on Intel Pentium III, but due to privacy concerns, this feature is no longer implemented on later models (the PSN feature bit is always cleared). Transmeta's Efficeon and Crusoe processors also provide this feature. AMD CPUs however, do not implement this feature in any CPU models.
Все процессоры 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]);
}//*/
Вам не нужен pusha. Компиляторы, поддерживающие этот встроенный синтаксис asm, знают, к каким регистрам вы прикасаетесь. И вы не используете popa до более позднего блока asm, поэтому, если вы беспокоились о том, чтобы наступить на регистры компилятора, вы в основном делаете его хуже, а не лучше. (Если только MSVC не знает, что CPUID записывает EBX?) В любом случае, после проверки, поддерживается ли CPUID вообще, вы обычно должны использовать внутреннюю функцию __cpuid() вместо встроенного asm.
Ваш процессор Pentium III? Если нет, то есть ли другой вопрос, который вы на самом деле пытаетесь задать?