本文目录导读:

- Windows 系统 (批处理/BAT脚本)
- PowerShell 脚本 (更强大)
- VBScript 脚本
- Python 脚本 (跨平台)
- Linux/Unix 脚本
- 推荐的完整方案 (PowerShell)
- 注意事项
我来介绍几种获取电脑唯一标识的方法,根据不同的需求和平台选择合适的方式:
Windows 系统 (批处理/BAT脚本)
使用 WMIC 获取硬件信息
@echo off echo ===== 计算机标识信息 ===== echo. echo 主板序列号: wmic baseboard get serialnumber echo. echo CPU序列号: wmic cpu get processorid echo. echo 硬盘序列号: wmic diskdrive get serialnumber echo. echo MAC地址: getmac /fo csv echo. echo 计算机GUID: reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography /v MachineGuid pause
生成唯一标识(推荐方法)
@echo off
set "COMPUTER_INFO=%COMPUTERNAME%-%USERNAME%"
:: 获取主板序列号
for /f "skip=1 tokens=2 delims==" %%i in ('wmic baseboard get serialnumber /value') do set "MB_SN=%%i"
:: 获取硬盘序列号
for /f "skip=1 tokens=2 delims==" %%i in ('wmic diskdrive get serialnumber /value') do set "DISK_SN=%%i"
:: 生成唯一标识
echo 计算机名: %COMPUTERNAME%
echo 用户: %USERNAME%
echo 主板序列号: %MB_SN%
echo 硬盘序列号: %DISK_SN%
echo.
echo 唯一标识: %COMPUTERNAME%-%MB_SN%-%DISK_SN%
pause
PowerShell 脚本 (更强大)
# 获取系统信息并生成唯一标识
function Get-MachineGUID {
# 方法1: 获取MachineGUID
$machineGUID = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Cryptography").MachineGuid
# 方法2: 获取BIOS信息
$biosInfo = Get-WmiObject -Class Win32_BIOS
$biosSerial = $biosInfo.SerialNumber
# 方法3: 获取硬盘信息
$diskInfo = Get-WmiObject Win32_DiskDrive | Select-Object -First 1
$diskSerial = $diskInfo.SerialNumber
# 生成组合标识
$uniqueID = $machineGUID + "-" + $biosSerial + "-" + $diskSerial
Write-Host "机器GUID: $machineGUID" -ForegroundColor Green
Write-Host "BIOS序列号: $biosSerial" -ForegroundColor Green
Write-Host "硬盘序列号: $diskSerial" -ForegroundColor Green
Write-Host "组合唯一标识: $uniqueID" -ForegroundColor Yellow
return $uniqueID
}
# 获取IP和MAC地址
function Get-NetworkInfo {
$networkAdapter = Get-NetAdapter | Where-Object {$_.Status -eq "Up"} | Select-Object -First 1
$ipConfig = Get-NetIPAddress -InterfaceIndex $networkAdapter.ifIndex -AddressFamily IPv4
Write-Host "IP地址: $($ipConfig.IPAddress)"
Write-Host "MAC地址: $($networkAdapter.MacAddress)"
}
# 执行
Get-MachineGUID
Get-NetworkInfo
VBScript 脚本
' 获取计算机唯一标识
Option Explicit
Dim objWMIService, objItem, colItems
Dim ComputerName, CPUID, MBID, MACID
ComputerName = "Computer: " & CreateObject("WScript.Network").ComputerName
' 获取CPU
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor",,48)
For Each objItem in colItems
CPUID = "CPU ID: " & objItem.ProcessorId
Next
' 获取主板
Set colItems = objWMIService.ExecQuery("Select * from Win32_BaseBoard",,48)
For Each objItem in colItems
MBID = "Motherboard SN: " & objItem.SerialNumber
Next
' 获取MAC地址
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True",,48)
For Each objItem in colItems
If Not IsNull(objItem.MACAddress) Then
MACID = "MAC: " & objItem.MACAddress
Exit For
End If
Next
WScript.Echo ComputerName
WScript.Echo CPUID
WScript.Echo MBID
WScript.Echo MACID
Python 脚本 (跨平台)
import platform
import uuid
import subprocess
import hashlib
import socket
def get_machine_id():
"""获取系统唯一标识"""
info = {}
# 1. 获取系统信息
info['system'] = platform.system()
info['node'] = platform.node()
info['release'] = platform.release()
# 2. 获取硬件信息
try:
# Linux/macOS
if platform.system() == "Linux":
result = subprocess.run(['cat', '/etc/machine-id'], capture_output=True)
info['machine_id'] = result.stdout.decode().strip()
elif platform.system() == "Darwin":
result = subprocess.run(['ioreg', '-rd1', '-c', 'IOPlatformExpertDevice'], capture_output=True)
info['machine_id'] = result.stdout.decode().strip()
elif platform.system() == "Windows":
result = subprocess.run(['wmic', 'csproduct', 'get', 'uuid'], capture_output=True)
info['machine_id'] = result.stdout.decode().strip().split('\n')[1].strip()
except:
info['machine_id'] = str(uuid.getnode())
# 3. MAC地址
info['mac_address'] = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff)
for elements in range(0,2*6,2)][::-1])
# 4. 生成唯一标识(哈希处理)
unique_string = f"{info['machine_id']}-{info['mac_address']}-{info['node']}"
info['unique_id'] = hashlib.md5(unique_string.encode()).hexdigest()
return info
# 执行示例
if __name__ == "__main__":
info = get_machine_id()
print("="*40)
print("系统: ", info['system'])
print("计算机名: ", info['node'])
print("系统版本: ", info['release'])
print("机器ID: ", info['machine_id'])
print("MAC地址: ", info['mac_address'])
print("唯一标识: ", info['unique_id'])
print("="*40)
Linux/Unix 脚本
#!/bin/bash # 获取 Linux 系统唯一标识 echo "===== 系统唯一标识 =====" echo # 方法1: 使用 /etc/machine-id echo "Machine ID: $(cat /etc/machine-id)" # 方法2: 使用 dmidecode 获取硬件信息 echo "主板序列号: $(sudo dmidecode -s baseboard-serial-number)" echo "系统序列号: $(sudo dmidecode -s system-serial-number)" # 方法3: 组合生成唯一标识 CPU_INFO=$(cat /proc/cpuinfo | grep 'model name' | uniq) DISK_SN=$(lsblk -no serial /dev/sda) MACHINE_ID=$(cat /etc/machine-id) FINGERPRINT=$(echo "$MACHINE_ID-$DISK_SN" | md5sum | cut -d' ' -f1) echo "CPU信息: $CPU_INFO" echo "硬盘序列号: $DISK_SN" echo "唯一指纹: $FINGERPRINT"
推荐的完整方案 (PowerShell)
# 生成稳定的机器指纹
function Get-HardwareFingerprint {
$fingerprint = @()
# 收集基础信息
$fingerprint += $env:COMPUTERNAME
$fingerprint += (Get-WmiObject Win32_BIOS).SerialNumber
$fingerprint += (Get-WmiObject Win32_BaseBoard).SerialNumber
$fingerprint += (Get-WmiObject Win32_Processor).ProcessorId
# 获取第一个物理硬盘序列号
$disk = Get-WmiObject Win32_DiskDrive | Where-Object {$_.InterfaceType -ne "USB"} | Select-Object -First 1
$fingerprint += $disk.SerialNumber
# 生成哈希值作为唯一标识
$hashString = $fingerprint -join "-"
$sha256 = [System.Security.Cryptography.SHA256]::Create()
$bytes = [System.Text.Encoding]::UTF8.GetBytes($hashString)
$hash = $sha256.ComputeHash($bytes)
return [Convert]::ToHexString($hash)
}
Write-Host "本机唯一标识: $(Get-HardwareFingerprint)" -ForegroundColor Cyan
注意事项
- WMI可能需要管理员权限 - 某些信息只能在管理员模式下获取
- 虚拟机会有不同标识 - VM中获取的唯一标识可能与物理机不同
- 硬件更换 - 如果更换硬件,标识可能会变化
- 隐私考虑 - 唯一标识可能包含敏感信息,请注意数据保护
建议使用多种硬件信息的组合(如CPU+主板+硬盘序列号)生成唯一标识,这样既相对稳定又不容易被伪造。