質問
PC の CPU のシリアル番号を取得するにはどうすればよいですか?
解決
質問に使用した「ライセンス」タグに基づいて、より良い結果が得られる可能性があります ネットワークMACアドレスの読み取り. 。MAC アドレスによる PC の識別は、完全に破壊できないコピー防止方法ではありませんが、それでも時々使用されます。
他のヒント
外部ライブラリを使用せずに、これに対する究極の答えが得られます。これを入力するだけです:
wmic bios のシリアル番号を取得する
これにより、PCSシャーシのシリアル番号が表示されます;)(Microsoftの知識ベースにあります)
よろしく!
最近のほとんどのコンピューターは、BIOS で CPU ID が無効になった状態で出荷されることに注意してください。見る ウィキペディアの CPUID
CPUID が有効になっている場合でも、実際に最新のプロセッサーで使用できるシリアル番号はありますか?このシリアル番号全体の問題が提起されたとき、Pentium 3 日間に大きな抗議があったことを覚えています。
これは古いスレッドです。しかし、私も同じ問題を抱えていましたが、if や but をあまり使わずに次のロジックを機能させることができました。
CPU のシリアル番号の問題は、仮想化環境では必ずしも動作するとは限らないことです。
Windows ベースのサーバーのセットを使用して次のロジックを実行しました。
Win32_BIOS
BIOS のシリアル番号を提供できます。システムが仮想化されている場合、すべてのサーバーで同じ BIOS シリアル番号が使用される可能性があることに留意する必要があります。
Win32_NetworkAdapter
同様に使用できる MAC を提供できます。複数の NIC がある場合は、複数の MAC が必要になります。
これら両方の ID を組み合わせると、物理サーバーと仮想サーバーにまたがる 6000 台のサーバーのセットにわたるすべての一意のセットが得られました。これは、次を使用して実装するのが非常に簡単でした ManagementClass
& ManagementObject
.
ただし、注意点があります:を取得しようとすると、 MO
インスタンスをリモートで実行する場合、遅延が 5ms 未満の 10Gbps 光ネットワークでは数秒以上かかります。つまり、計算してみると、単一スレッドの操作に 3 時間以上かかりました。これは優先度の低いトラフィックに近いため、収集のためにネットワークにスパムを送信したくありませんでした。 WMI
マルチスレッド呼び出しのデータ。
CPU シリアル ID (PSN;CPUID edx ビット 18 "psn" プロセッサ シリアル番号) Intel CPU の Pentium III 以降。そして、AMD チップには psn は存在しませんでした。
https://software.intel.com/en-us/forums/watercooler-catchall/topic/308483 (2005年当時)
ただし、Pentium III プロセッサによって導入されたプロセッサ シリアル番号機能をサポートしているのは、Pentium III Xeon、Mobile Pentium III、および Pentium III プロセッサのみであることに注意してください。他の Intel プロセッサーはプロセッサーのシリアル番号機能をサポートしていません
https://en.wikipedia.org/wiki/Pentium_III#Controversy_about_privacy_issues
https://en.wikipedia.org/wiki/CPUID#EAX=3:_プロセッサー_シリアル番号
EAX=3:プロセッサのシリアル番号も参照してください:Pentium III § プライバシー問題に関する論争
これにより、プロセッサのシリアル番号が返されます。プロセッサのシリアル番号は Intel Pentium III で導入されましたが、プライバシー上の懸念により、この機能は以降のモデルでは実装されなくなりました (PSN 機能ビットは常にクリアされます)。Transmeta の Efficeon および Crusoe プロセッサもこの機能を提供します。ただし、AMD CPU はどの CPU モデルにもこの機能を実装していません。
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>
注記: プロセッサのシリアル番号は Intel Pentium III で導入されましたが、プライバシー上の懸念により、この機能は以降のモデルでは実装されなくなりました。
ソース : ウィキペディア
Ivy Bridge CPU 以降のすべてには、PPIN (保護されたプロセッサー識別番号) が含まれています。この機能へのアクセスは、コンピューターのファームウェアによってブロックされる場合があります。
さらに詳しく教えてください:オペレーティング システム、言語。
たとえば、Windows では、WMI を使用して読み取ることで取得できます。 Win32_Processor.ProcessorId.
Windows では、システム コールがあると確信しています。Linux では、「sudo lshw」を試行できますが、ほとんどのカーネルは CPU シリアル番号をサポートしていないようです。予備調査によると、一意に識別可能なコンピュータに対する一般的な怒りは、完璧な答えはありません。
あなたは何をしようとしているのですか?ほぼ間違いなく、誰かが以前にそれを行ったことがあるので、彼らが行ったことを再利用またはエミュレートすることが賢明かもしれません。
適切なレジスタ設定で CPUID 命令を実行すると、EAX、EBX、ECX、および EDX のプロセッサのシリアル番号が取得されます。ただし、この機能は Pentium 3 以降のプロセッサでのみ使用できます。また、Pentium 4 以降のプロセッサでは、命令は常に 4 つのレジスタすべてに 0x00000000 を返します。新しいモデルの Pentium 3 も 0x00000000 を返す場合があります。この機能は主にコピー防止を目的としており、ソフトウェアを特定のプロセッサにリンクできるようにします。コミュニティの評判は悪く、訴訟が起きた。この機能は、後期モデルの P3 およびすべての新しいプロセッサーから削除されました。この機能は、互換性上の理由から、新しいプロセッサに存在します。噂によると、プロセッサーをシリアル番号で特別注文できるとのことですが、最低購入数は 100 万プロセッサー程度です。CPUID 命令を実行する前の特定のレジスタ設定については、Web サイトから入手できる Intel システム プログラマの 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