python获取设备唯一性物理地址

  有时候软件功能做激活需要知道设备唯一性ID,下面给出python的相关的代码与说明。

1. 使用主板,CPU,硬盘序列号组合生成物理唯一机器码

下列代码中获取了主板,CPU,硬盘序列号,然后使用MD5进行加密,加密为物理唯一机器码

import subprocess
import hashlib


def get_hw_ids():
    def run_cmd(cmd):
        try:
            return subprocess.check_output(cmd, shell=True).decode().strip().split('\n')[-1].strip()
        except:
            return ""

    # 1. 获取主板序列号 (最稳妥)
    board = run_cmd("wmic baseboard get serialnumber")
    print("board",board) #PPVAR038JGH0JS

    # 2. 获取CPU序列号
    cpu = run_cmd("wmic cpu get processorid")
    print("cpu",cpu)#BFEBFBFF000906A3

    # 3. 获取硬盘序列号 (物理)
    disk = run_cmd("wmic diskdrive get serialnumber")
    print("disk",disk)#E823_8FA6_BF53_0001_001B_448B_45C2_99AC.

    return board, cpu, disk


def get_combined_machine_hash():
    board, cpu, disk = get_hw_ids()
    # 将多个硬件信息组合起来
    raw_id = f"BOARD:{board}|CPU:{cpu}|DISK:{disk}"
    # 生成 32 位 MD5 作为唯一机器码
    return hashlib.md5(raw_id.encode()).hexdigest().upper()


print(f"你的物理唯一机器码: {get_combined_machine_hash()}")  #3B05E52C5FB602CA4BC46648E4C4BEA6

  如果只是想要获取物理唯一机器码,到这里就可以结束了。

2. 查看所有网卡真实MAC

import psutil # 如果没有请 pip install psutil

# 查看所有网卡的真实 MAC
addrs = psutil.net_if_addrs()
for name, info in addrs.items():
    for addr in info:
        if addr.family == psutil.AF_LINK:
            print(f"网卡名: {name}, MAC地址: {addr.address}")
            clean_mac = addr.address.replace("-", "").replace(":", "")

            # 2. 十六进制转十进制
            decimal_mac = int(clean_mac, 16)
            print(decimal_mac)

image

看图中,Windows 下带 * 的通常是虚拟的网卡。真实的网卡为以太网,WLAN。

3.获取所有物理网卡MAC
import psutil
all_mac_id=[]

def get_real_hardware_id():
    # 找寻真正的物理网卡 MAC
    addrs = psutil.net_if_addrs()
    for name, info in addrs.items():
        # 排除虚拟网卡
        if "Loopback" in name or "*" in name or "Virtual" in name:
            continue
        for addr in info:
            if addr.family == psutil.AF_LINK:
                # 检查 MAC 地址第一个字节的最后一位是否为 0 (判断是否为物理地址)
                first_byte = int(addr.address.split('-')[0], 16)
                if first_byte & 1 == 0:
                    # 这是一个真正的物理网卡!
                    # return addr.address # 或者转十进制
                    all_mac_id.append(addr.address)
    return all_mac_id

print(f"真正靠谱的物理 ID: {get_real_hardware_id()}")

image

 4.uuid.getnode()存在的问题

  看下面代码

import uuid


print(f"uuid.getnode() 返回的值: {uuid.getnode()}")
hex_str = hex(uuid.getnode())
print(hex_str) #0xc778cf43dc10

  有时候会遇到使用uuid.getnode()第一天与第二天得到的id不同,导致又要激活的问题。

image

  在 MAC 地址规范中,第一个字节的最后一位如果是 1,代表这本质上是一个 Multicast(组播)/ 临时随机地址,而不是厂家烧录的物理硬件地址。Python 环境因为某种权限限制或者系统安全策略,没能成功调用 Windows 的底层硬件接口,于是它随手“编”了一个随机数给你。这个随机数下次重启可能就变了。在 Windows 上,如果没有足够的权限访问网卡信息,或者被防火墙/安全软件拦截了底层查询,uuid.getnode() 也会直接返回随机值。

 

 

 

 

 

小结:介绍了获取物理地址的方法,建议使用第一种方法,然后使用md5加密生成设备物理唯一id。

 

posted @ 2026-03-26 11:43  wancy  阅读(3)  评论(0)    收藏  举报