Серийный номер процессора

Как мне получить серийный номер ЦП на ПК?

Ваш процессор Pentium III? Если нет, то есть ли другой вопрос, который вы на самом деле пытаетесь задать?

Joe Hildebrand 18.09.2008 10:29

На этой странице есть отличный ответ. stackoverflow.com/questions/3474940/unique-computer-id/…

Oli B 24.09.2016 01:51
stackoverflow.com/questions/3474940/unique-computer-id/… This page has the answer. :)
Oli B 24.09.2016 01:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
3
59 513
13

Ответы 13

Вы можете использовать команду CPUID.

Используйте инструмент CPUZ: http://www.cpuid.com/cpuz.php

Поскольку это сайт программирования, я подозреваю, что он спрашивает, как программно получить серийный номер. Он использовал лицензионный тег, который подозревает, что он собирается использовать его для создания серийных номеров для своего приложения.

Espo 18.09.2008 10:20

Еще немного подробностей: операционная система, язык.

Например, в Windows вы можете получить его, используя WMI и прочитав Win32_Processor.ProcessorId.

Да и ProcessorId - это какой-то (полу) уникальный идентификатор процессора.

Biri 18.09.2008 10:49

Я думаю, довольно много компиляторов предлагают некоторую оболочку или что-то подобное вокруг упомянутого команда. Вот пример

#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. Это не стандартно. И вам нужно выполнить линковку с соответствующими библиотеками.

Friedrich 23.08.2010 11:30

Помните, что большинство компьютеров в наши дни поставляются с отключенным идентификатором процессора в 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/…

osgx 05.01.2018 16:14

Я уверен, что в Windows есть системный вызов. В Linux можно попробовать "sudo lshw", но большинство ядер, похоже, не поддерживают серийные номера ЦП, и предварительные исследования, похоже, указывают на то, что общее возмущение по поводу однозначно идентифицируемых компьютеров означает, что есть нет идеального ответа.

Что ты пытаешься сделать? Почти наверняка кто-то делал это раньше, и может быть целесообразно повторно использовать или подражать тому, что они сделали.

У меня есть окончательный ответ без каких-либо внешних библиотек. Просто введите это:

wmic bios получить серийный номер

Это даст вам серийный номер на корпусе ПК;) (можно найти в базе знаний Microsoft)

С Уважением!

вернул мне текст «Серийный номер системы» на моем i7. У вас есть ссылка на указанную статью базы знаний?

0xC0DEFACE 17.08.2010 10:58

Текст «Серийный номер системы» типичен для систем белого ящика. Предполагается, что производитель ПК заменит его перед тем, как продать его.

codekaizen 24.01.2014 00:09

С моей доской возвращается сообщение «Для заполнения O.E.M.» => ненадежно => вероятно, лучше использовать что-нибудь еще, например MAC-адрес, если он доступен.

Paul Groke 08.01.2016 22:56

Это и старая ветка. Но у меня была такая же проблема, но следующая логика работала без лишних «если», «и» или «но».

Проблема с серийным номером ЦП в том, что он не всегда работает в виртуализированной среде.

Я проделал следующую логику с набором серверов на базе 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 (защищенный идентификационный номер процессора). Доступ к этой функции может быть заблокирован прошивкой компьютера.

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

Выполнение инструкции 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.

Peter Cordes 02.05.2019 07:16

Другие вопросы по теме