web-dev-qa-db-ja.com

CPUシリアル番号

PCのCPUのシリアル番号を取得するにはどうすればよいですか?

14
selwyn

質問に使用した「ライセンス」タグに基づいて、より良い結果が得られる可能性があります ネットワークMACアドレスの読み取り 。 MACアドレスでPCを識別することは、コピー防止のための完全に破られない方法ではありませんが、それでも時々使用されます。

5
Sergey Volegov

私はこれに対する究極の答えを外部ライブラリなしで持っています。次のように入力するだけです。

wmic biosはシリアル番号を取得します

これにより、PCシャーシのシリアル番号がわかります;)(Microsoftのナレッジベースにあります)

よろしく!

16
Makar

最近のほとんどのコンピューターは、BIOSでCPUIDが無効になっている状態で出荷されていることを忘れないでください。 ウィキペディアのCPUID を参照してください

6
Redbeard

IntelCPUのPentiumIIIの後にCPUシリアルID(PSN; CPUIDedxビット18 "psn"プロセッサシリアル番号)はありません。そしてAMDチップにはpsnはありませんでした:

https://software.intel.com/en-us/forums/watercooler-catchall/topic/30848 (2005年)

ただし、Pentium III Xeon、モバイルPentium III、およびPentium IIIプロセッサのみが、PentiumIIIプロセッサによって導入されたプロセッサシリアル番号機能をサポートしていることに注意してください。他のIntelプロセッサはプロセッサのシリアル番号機能をサポートしていません

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

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

EAX = 3:プロセッサのシリアル番号参照:PentiumIII§プライバシーの問題に関する論争

これにより、プロセッサのシリアル番号が返されます。プロセッサのシリアル番号はIntelPentium IIIで導入されましたが、プライバシー上の懸念から、この機能は以降のモデルでは実装されなくなりました(PSN機能ビットは常にクリアされます)。 TransmetaのEfficeonおよびCrusoeプロセッサもこの機能を提供します。ただし、AMD CPUは、どのCPUモデルにもこの機能を実装していません。

3
osgx

これは古いスレッドです。しかし、私は同じ問題を抱えていましたが、次のロジックがあまり多くのif、ands、またはbutsなしで機能するようになりました。

CPUシリアル番号の問題は、仮想化環境で常に機能するとは限らないことです。

私は一連のWindowsベースのサーバーで次のロジックを実行しました。

Win32_BIOSはBIOSのシリアル番号を提供できます。システムが仮想化されている場合、すべてのサーバーで同じBIOSシリアル番号になる可能性があることに注意する必要があります。

Win32_NetworkAdapterは、同様に使用できるMACを提供できます。 NICが複数ある場合は、MACが複数になります。

これらの両方のIDを組み合わせると、物理サーバーと仮想サーバーにまたがる6000台のサーバーのセットにすべての一意のセットがありました。これは、ManagementClassManagementObjectを使用して実装するのは本当に簡単でした。

ただし、注意点:MOインスタンスをリモートで取得しようとすると、遅延が5ミリ秒未満の10Gbps光ネットワークでは数秒以上かかります。したがって、計算を行うと、シングルスレッド操作で3時間以上かかりました。これは優先度の低いトラフィックに似ているため、マルチスレッド呼び出しでWMIデータを収集するためにネットワークにスパムを送信したくありませんでした。

2
BlackTalon

CPUIDが有効になっている場合でも、実際に最新のプロセッサで使用できるシリアル番号はありますか?このシリアル番号全体の問題が提起された3日間、Pentiumで大きな抗議があったことを覚えています。

2
Patrick_O

Ivy Bridge CPU以降には、すべてPPIN(保護されたプロセッサ識別番号)が含まれています。この機能へのアクセスは、コンピューターのファームウェアによってブロックされる可能性があります。

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

1
DynamiteHeaddy

CPUZツールを使用します: http://www.cpuid.com/cpuz.php

1
Bruce

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

  • ヘッダー:#include <cpuid.h>

注:プロセッサのシリアル番号はIntel Pentium IIIで導入されましたが、プライバシー上の懸念から、これはこの機能は、以降のモデルでは実装されなくなりました。

ソース: ウィキペディア

1
Amir

適切なレジスタ設定でCPUID命令を実行すると、EAX、EBX、ECX、およびEDXのプロセッサシリアル番号が取得されます。ただし、この機能はPentium3以降のプロセッサでのみ使用できます。また、Pentium 4以降のプロセッサでは、命令は4つのレジスタすべてで常に0x00000000を返します。それ以降のモデルのPentium3も0x00000000を返す場合があります。この機能は主にコピー防止を目的としており、ソフトウェアを特定のプロセッサにリンクできるようにします。それは地域社会にうまく行き渡らず、訴訟が続いた。この機能は、後期モデルのP3およびすべての新しいプロセッサから削除されました。この機能は、互換性の理由から新しいプロセッサに搭載されています。シリアル番号付きの特別注文プロセッサよりも噂されていますが、最小購入額は100万プロセッサ程度です。 CPUID命令を実行する前の特定のレジスタ設定については、IntelのシステムプログラマーPDFのWebサイトから入手できます。

また-


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

詳細については、オペレーティングシステム、言語をご覧ください。

たとえば、Windowsでは、WMIを使用して Win32_Processor.ProcessorId を読み取ることで取得できます。

0
Biri

Windowsでは、システムコールがあると確信しています。Linuxでは、「Sudo lshw」を試すことができますが、ほとんどのカーネルはCPUシリアル番号をサポートしていないようです。予備調査によると、一意に識別可能なコンピューターに対する一般的な怒りは、完璧な答えではありません。

あなたは何をしようとしているのですか?ほぼ確実に誰かが以前にそれを行ったことがあるので、彼らが行ったことを再利用またはエミュレートするのが賢明かもしれません。

0
Sqeaky