CPU-Seriennummer
-
01-07-2019 - |
Frage
Wie erhalte ich die Seriennummer der CPU in einem PC?
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!
, 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.
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