سؤال

كيف يمكنني الحصول على الرقم التسلسلي من وحدة المعالجة المركزية في جهاز الكمبيوتر ؟

هل كانت مفيدة؟

المحلول

استنادا إلى 'الترخيص' الوسم كنت قد استخدمت على سؤالك أنك قد تحصل على نتائج أفضل شبكة القراءة عنوان MAC.تحديد جهاز الكمبيوتر عن طريق عنوان MAC ليس تماما غير قابلة للكسر طريقة نسخ الحماية لا تزال تستخدم في بعض الأحيان.

نصائح أخرى

لدي الجواب النهائي لهذا دون أي المكتبات الخارجية.ببساطة اكتب هذا:

wmic bios get واثنين, مأخوذة من عكسها

هذا وسوف تعطيك الرقم التسلسلي على أجهزة الكمبيوتر هيكل ;) (وجدت في microsoft knowledge base)

التحيات!

تذكر أن معظم أجهزة الكمبيوتر هذه الأيام السفينة مع CPU ID المعوقين في BIOS.انظر CPUID على ويكيبيديا

حتى مع CPUID تمكين هل هناك فعلا الرقم التسلسلي المتاحة في المعالجات الحديثة?اتذكر انه كان كبير احتجاج في بنتيوم 3 أيام عند هذا كله الرقم التسلسلي أثيرت هذه المسألة.

هذا هو الموضوع القديم.ولكن كان لدي نفس المشكلة لكن لدي التالية منطق العمل دون الكثير من لو أو تحفظات.

المشكلة مع وحدة المعالجة المركزية الرقم التسلسلي هو أنه لا يعمل دائما في بيئة افتراضية.

لم المنطق التالي مع مجموعة من الخوادم التي تستند إلى Windows:

Win32_BIOS يمكن أن توفر لك رقم تسلسلي من bios.ونحن بحاجة إلى أن نضع في اعتبارنا أنه إذا كان النظام الافتراضية, يمكنك في نهاية المطاف مع نفس bios الرقم التسلسلي لجميع الخوادم.

Win32_NetworkAdapter يمكن أن توفر لك ماك التي يمكنك استخدامها كذلك.في الحالات التي يكون فيها لديك Nic متعددة, سوف ينتهي بك الأمر مع عدة أجهزة ماكينتوش.

الجمع بين كل هذه المعرفات ، مجموعة فريدة من نوعها على مجموعة من 6000 خوادم تمتد عبر المادية والافتراضية.هذا هو حقا بسيطة لتنفيذ باستخدام ManagementClass & ManagementObject.

ولكن مجرد التحذير:عندما كنت في محاولة للحصول على MO على سبيل المثال عن بعد سوف يستغرق أكثر من بضع ثوان على <5 مللي ثانية الكمون 10Gbps الشبكة البصرية.حتى إذا كنت تفعل الرياضيات استغرق مني أكثر من 3 ساعات على خيط واحد من العملية.لأن هذا هو أشبه منخفضة أولوية المرور لم أكن أريد أن البريد المزعج شبكة بلدي جمع WMI بيانات متعددة الخيوط الاتصال.

لا يوجد وحدة المعالجة المركزية المسلسل معرف (PSN;CPUID edx بت 18 "psn" معالج الرقم التسلسلي) بعد بنتيوم الثالث في وحدات المعالجة المركزية إنتل;ولم يكن هناك أي psn في AMD رقائق:

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

لكن, نضع في اعتبارنا أن فقط Xeon Pentium III, Mobile Pentium III و بنتيوم الثالث من معالجات تدعم المعالج الرقم التسلسلي ميزة عرض Pentium III processor.لا غيرها من معالج إنتل يدعم المعالج الرقم التسلسلي ميزة

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

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

EAX=3:المعالج الرقم التسلسلي انظر أيضا:بنتيوم III § الجدل حول قضايا الخصوصية

هذا يعود المعالج الرقم التسلسلي.المعالج رقم المسلسل تم عرضه على معالج إنتل بنتيوم الثالث ، ولكن بسبب مخاوف الخصوصية هذه الميزة لم تعد تنفيذها على نماذج لاحقة (PSN ميزة بت دائما مسح).Transmeta هو Efficeon و كروزو المعالجات أيضا توفر هذه الميزة.وحدات المعالجة المركزية AMD ولكن لا تنفذ هذه الميزة في أي وحدة المعالجة المركزية النماذج.

استخدام CPUZ أداة: http://www.cpuid.com/cpuz.php

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

  • الرأس: #include <cpuid.h>

ملاحظة: المعالج رقم المسلسل تم عرضه على معالج إنتل بنتيوم الثالث ، ولكن بسبب مخاوف الخصوصية هذه الميزة لم تعد تنفيذها على نماذج في وقت لاحق.

المصدر : ويكيبيديا

جسر اللبلاب وحدات المعالجة المركزية الجديدة تشمل جميع PPIN (محمية المعالج رقم الهوية).الوصول إلى هذه الميزة يمكن أن يكون قد تم حظره من قبل الكمبيوتر الثابتة.

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

بعض مزيد من التفاصيل يرجى:نظام التشغيل واللغة.

على سبيل المثال على ويندوز يمكنك الحصول عليه باستخدام WMI و القراءة Win32_Processor.ProcessorId.

في نظام التشغيل windows, أنا متأكد من أن هناك مكالمة النظام في لينكس يمكن للمرء أن محاولة "سودو lshw" ولكن معظم حبات لا يبدو أن دعم وحدة المعالجة المركزية الأرقام التسلسلية ، و البحوث الأولية تشير إلى أن الغضب ضد الفريدة أجهزة الكمبيوتر يعني أنه لا توجد إجابة شافية.

ماذا تحاول أن تفعل ؟ يكاد يكون من المؤكد شخص قد فعلت ذلك من قبل و قد يكون من الحكمة إعادة استخدام أو محاكاة ما قاموا به.

تنفيذ CPUID التعليمات مع حسن إعدادات التسجيل سيتم استرداد المعالج الرقم التسلسلي في EAX, EBX, ECX, و EDX.ومع ذلك ، تتوفر هذه الوظيفة فقط على بنتيوم 3 وما بعدها المعالجات.أيضا على بنتيوم 4 و أحدث معالجات التعليمات يعود دائما 0x00000000 في كل 4 السجلات.في وقت لاحق من طراز بنتيوم 3 قد يعود أيضا 0x00000000 هو.الميزة كانت تهدف في المقام الأول إلى حماية النسخ ، مما يسمح البرنامج إلى ربط محددة المعالجات.فإنه لم يذهب أكثر مع المجتمع ، والدعاوى القضائية تلت ذلك.تم إزالة ميزة من أواخر نموذج P3 و جميع أحدث المعالجات.ميزة موجودة في أحدث المعالجات لأسباب التوافق.ويشاع مما يمكن أن أمر خاص المعالجات مع الأرقام التسلسلية ، btu شراء الحد الأدنى هو 1 مليون المعالجات.معينة إعدادات التسجيل قبل تنفيذ CPUID التعليمات ، تحقق إنتل نظام مبرمج PDF المتاحة من خلال الموقع.

أيضا -


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

يمكنك استخدام CPUID الأوامر.

اعتقد عدد قليل جدا من مترجم لا نقدم بعض المجمع أو ما شابه حول المذكورة الأوامر.هنا مثال

#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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top