Frage

Wie erhalte ich die Seriennummer der CPU in einem PC?

War es hilfreich?

Lösung

Basierend auf ‚Lizenzen‘ Tag, das Sie für Ihre Frage verwendet haben, können Sie bessere Ergebnisse Lesen Netzwerk MAC-Adresse . Identifizieren von PC durch eine MAC-Adresse ist nicht völlig unzerbrechlich Verfahren zum Kopierschutz, noch wird es manchmal verwendet.

Andere Tipps

Ich habe die ultimative Antwort auf diese ohne externe Bibliotheken. Ganz einfach eingeben:

wmic BIOS erhalten serial

Dies gibt Ihnen die Seriennummer auf der PC-Chassis;) (In Microsoft Knowledge Base gefunden)

Viele Grüße!

Denken Sie daran,

, dass die meisten Computer in diesen Tagen Schiff mit CPU-ID im BIOS deaktiviert. Siehe CPUID auf Wikipedia

Auch mit CPUID aktiviert ist es tatsächlich eine Seriennummer in modernen Prozessoren zur Verfügung? Ich erinnere mich, es ein großer Aufschrei in der Pentium 3 Tage zu sein, wenn dieses ganze Seriennummer Thema angesprochen wurde.

Dies ist und alter Thread. Aber ich hatte ein gleiches Problem, aber ich habe die folgende Logik arbeiten, ohne zu vielen Wenn und Aber.

Das Problem mit CPU-Seriennummer ist, dass es nicht immer in virtualisierten Umgebung funktioniert.

Ich habe die folgende Logik mit einer Reihe von Windows-basierten Servern:

Win32_BIOS können Sie eine Seriennummer des BIOS zur Verfügung stellen. Wir müssen bedenken, dass, wenn das System virtualisiert ist, können Sie mit dem gleichen BIOS-Seriennummer für alle Server könnten am Ende.

Win32_NetworkAdapter können Sie eine MAC zur Verfügung stellen, die Sie auch nutzen können. In Fällen, in denen Sie mehrere NICs haben, werden Sie sich mit mehreren MACs beenden.

Die Kombination diese beiden IDs, hatte ich alle eindeutigen Satz über einen Satz von 6000 Servern in physischen und virtuellen überspannen. Das war wirklich einfach mit ManagementClass & ManagementObject zu implementieren.

Aber nur eine Einschränkung: wenn Sie versuchen, remote auf die MO Instanz zu erhalten, wird es mehr als ein paar Sekunden auf einem <5 ms Latenz 10Gbps optisches Netzwerk. Also, wenn Sie die Mathematik zu tun hat es mich mehr als 3 Stunden auf einem einzigen Thread-Betrieb. Da es sich eher wie ein Verkehr niedrige Priorität wollte ich nicht mein Netzwerk Spam WMI Daten auf Multi-Threaded-Aufruf zum Sammeln.

Es gibt keine CPU-Seriennummer (PSN; CPUID edx Bit 18 "psn" Processor Serial Number) nach Pentium III in Intel-CPUs; und es gab nie psn in AMD-Chips:

https://software.intel.com/en -US / Foren / Wasserspender-catchall / Thema / 308.483 (bei 2005)

  

Doch bedenken Sie, dass nur der Pentium III Xeon, Mobile Pentium III und Pentium III Prozessoren der Prozessor-Seriennummer Funktion eingeführt durch den Pentium-III-Prozessor unterstützen. Kein anderer Intel-Prozessor unterstützt die Prozessor-Seriennummer Funktion

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

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

  

EAX = 3: Prozessor-Seriennummer   Siehe auch: Pentium III § Streit um Fragen der Privatsphäre

     

Dies gibt die Seriennummer des Prozessors. Die Prozessor-Seriennummer wurde auf Intel Pentium III eingeführt, aber aufgrund der Bedenken hinsichtlich der Privatsphäre, ist diese Funktion nicht mehr bei späteren Modellen implementiert (das PSN Feature-Bit wird immer gelöscht). Transmeta Efficeon und Crusoe-Prozessoren bieten diese Funktion auch. AMD CPUs jedoch nicht implementieren diese Funktion in jeder CPU-Modelle.

Mit dem CPUZ Werkzeug: http://www.cpuid.com/cpuz.php

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

  • Rubrik: #include <cpuid.h>

. Hinweis: Der Prozessor Seriennummer auf Intel Pentium III eingeführt wurde, aber wegen Bedenken hinsichtlich der Privatsphäre, diese Funktion wird nicht mehr bei späteren Modellen implementiert

Quelle: wikipedia

Ivy-Bridge-CPUs und neuere verfügen alle über einen PPIN (Protected Processor Identification Number). Der Zugriff auf diese Funktion kann durch die Firmware des Computers blockiert werden.

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

Einige weitere Details bitte: Betriebssystem, Sprache

.

Zum Beispiel unter Windows können Sie es mithilfe von WMI und Lesen Win32_Processor. processorID .

In Fenstern, ich bin sicher, dass es ein Systemaufruf ist, in Linux könnte man versuchen, „sudo lshw“ aber die meisten Kerne scheinen nicht CPU-Seriennummern zu unterstützen und vorläufige Forschung scheint darauf hinzudeuten, dass die allgemeine Empörung gegen eindeutig identifizierbaren Computer bedeutet, dass es keine perfekte Antwort.

Was wollen Sie tun? Fast sicher jemand hat es schon getan und es kann klug sein, wieder zu verwenden oder zu emulieren, was sie getan haben.

Ausführen der CPUID-Befehl mit den richtigen Registereinstellungen wird die Prozessor-Seriennummer in EAX, EBX, ECX und EDX abzurufen. Allerdings ist diese Funktionalität nur auf Pentium 3 und späteren Prozessoren. Auch auf Pentium 4 und neueren Prozessoren die Anweisung gibt immer 0x00000000 in allen vier Registern. Später Modell Pentium 3 ist auch zurückkehren 0x00000000 ist. Das Feature wurde in erster Linie auf Kopierschutz gerichtet, so dass Software auf bestimmte Prozessoren verknüpft werden. Es ging über nicht gut mit der Gemeinde, und Klagen folgten. Die Funktion wurde vom späten Modell P3 und alle neueren Prozessoren entfernt. Die Funktion ist in neueren Prozessoren aus Kompatibilitätsgründen vorhanden. es wird gemunkelt, als Sie Sonderauftrag Prozessoren mit Seriennummern können, die minimale Kauf Btu so etwas wie eine Million Prozessoren ist. Für die spezifischen Registereinstellungen vor dem CPUID-Befehl ausgeführt wird, überprüfen Intels Systemprogrammierer PDF über ihre Website.

Auch -


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

Sie können mit CPUID Befehl.

Ich denke, ziemlich viele Compiler einige Wrapper oder dergleichen um die erwähnten bieten Befehl. Hier ist ein Beispiel

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

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

Ausgabe:

Vendor: GenuineIntel
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top