Question

Comment puis-je obtenir le numéro de série de la CPU sur un PC?

Était-ce utile?

La solution

Sur la base de la balise "licensing" que vous avez utilisée pour votre question, vous obtiendrez de meilleurs résultats lecture de l'adresse MAC du réseau . Identifier un PC avec une adresse MAC n’est pas une méthode de protection contre la copie totalement incassable, même si elle est parfois utilisée.

Autres conseils

J'ai la réponse ultime à cela, sans aucune bibliothèque externe. Tapez simplement ceci:

Le bios Wmic reçoit le numéro de série

Cela vous donnera le numéro de série sur le châssis du PC;) (trouvé dans la base de connaissances de Microsoft)

Cordialement!

N'oubliez pas que, de nos jours, la plupart des ordinateurs sont livrés avec l'ID du processeur désactivé dans le BIOS. Voir CPUID sur Wikipedia

Même avec l'UCID activé, existe-t-il réellement un numéro de série disponible dans les processeurs modernes? Je me souviens du grand tollé suscité par le Pentium 3 jours lorsque cette question de numéro de série a été soulevée.

Ceci est un ancien fil. Mais j’ai eu le même problème, mais j’ai eu la logique suivante qui fonctionne sans trop de ifs, ni de mais.

Le problème avec le numéro de série de la CPU est qu’il ne fonctionne pas toujours dans un environnement virtualisé.

J'ai utilisé la logique suivante avec un ensemble de serveurs Windows:

Win32_BIOS peut vous fournir un numéro de série du bios. Nous devons garder à l’esprit que si le système est virtualisé, vous pouvez vous retrouver avec le même numéro de série de bios pour tous les serveurs.

Win32_NetworkAdapter peut vous fournir un MAC que vous pouvez également utiliser. Si vous avez plusieurs cartes réseau, vous obtiendrez plusieurs MAC.

En combinant ces deux identifiants, je possédais un ensemble unique sur un ensemble de 6 000 serveurs, physiques et virtuels. C’était très simple à mettre en oeuvre avec ManagementClass & Amp; ManagementObject.

Mais juste une mise en garde: lorsque vous essayez d’obtenir l’instance MO à distance, cela prend plus de quelques secondes sur un réseau optique < 5ms avec une latence de 5 ms. Donc, si vous faites le calcul, cela m'a pris plus de 3 heures sur une opération à un seul thread. Comme il s’agit plus d’un trafic de faible priorité, je n’ai pas voulu spammer mon réseau pour collecter WMI des données lors d’un appel multi-thread.

Il n'y a pas d'identifiant de série de la CPU (PSN; CPUID bit edx 18 & "; psn &". Numéro de série du processeur) après le Pentium III dans les processeurs Intel; et il n'y a jamais eu de psn dans les puces AMD:

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

  

Cependant, gardez à l'esprit que seuls les processeurs Pentium III Xeon, Mobile Pentium III et Pentium III prennent en charge la fonctionnalité de numéro de série de processeur introduite par le processeur Pentium III. Aucun autre processeur Intel ne prend en charge la fonction de numéro de série du processeur

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

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

  

EAX = 3: numéro de série du processeur   Voir aussi: Pentium III & # 167; Controverse sur les questions de confidentialité

     

Ceci retourne le numéro de série du processeur. Le numéro de série du processeur a été introduit sur Intel Pentium III, mais pour des raisons de confidentialité, cette fonctionnalité n'est plus implémentée sur les modèles suivants (le bit de fonctionnalité PSN est toujours effacé). Les processeurs Efficeon et Crusoe de Transmeta fournissent également cette fonctionnalité. Cependant, les processeurs AMD n’implémentent pas cette fonctionnalité dans les modèles de processeurs.

Utilisez l'outil CPUZ: http://www.cpuid.com/cpuz.php

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

  • En-tête: #include <cpuid.h>

Remarque: Le numéro de série du processeur a été introduit sur Intel Pentium III, mais pour des raisons de confidentialité, cette fonctionnalité n'est plus implémentée sur les modèles ultérieurs.

Source: wikipedia

Les processeurs Ivy Bridge et plus récents incluent tous un numéro d’identification protégé du processeur (PPIN). L'accès à cette fonctionnalité peut être bloqué par le micrologiciel de l'ordinateur.

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

Quelques précisions supplémentaires: système d'exploitation, langue.

Par exemple, sous Windows, vous pouvez l’obtenir en utilisant WMI et en lisant Win32_Processor. Identificateur de processus .

Dans Windows, je suis sûr qu’il existe un appel système. Sous Linux, vous pouvez essayer & "sudo lshw &"; mais la plupart des noyaux ne semblent pas supporter les numéros de série des processeurs, et des recherches préliminaires semblent indiquer que l'indignation générale à l'encontre d'ordinateurs uniquement identifiables signifie qu'il n'y a pas de réponse parfaite.

Qu'est-ce que vous essayez de faire? Il est presque certain que quelqu'un l'a déjà fait et il peut être judicieux de réutiliser ou d'imiter ce qu'il a fait.

L'exécution de l'instruction CPUID avec les paramètres de registre appropriés permet d'extraire le numéro de série du processeur dans EAX, EBX, ECX et EDX. Cependant, cette fonctionnalité n'est disponible que sur les processeurs Pentium 3 et ultérieurs. De plus, sur les processeurs Pentium 4 et plus récents, l'instruction renvoie toujours 0x00000000 dans les 4 registres. Les modèles plus récents de Pentium 3 peuvent également renvoyer 0x00000000. Cette fonctionnalité visait principalement la protection contre la copie, permettant de lier les logiciels à des processeurs spécifiques. Cela n'a pas bien marché avec la communauté et des poursuites judiciaires ont suivi. La fonctionnalité a été supprimée des derniers modèles de P3 et de tous les processeurs les plus récents. La fonctionnalité est présente dans les nouveaux processeurs pour des raisons de compatibilité. On dit que vous pouvez utiliser des processeurs de commande spéciale avec des numéros de série, mais l'achat minimum est d'environ un million de processeurs. Pour connaître les paramètres de registre spécifiques préalables à l'exécution de l'instruction CPUID, consultez le PDF du programmeur système d'Intels disponible sur son site Web.

Aussi -


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

Vous pouvez utiliser la commande CPUID .

Je suppose que pas mal de compilateurs proposent des wrappers ou similaires autour du commander. Voici un exemple

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

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

Sortie:

Vendor: GenuineIntel
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top