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)

看图中,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()}")

4.uuid.getnode()存在的问题
看下面代码
import uuid print(f"uuid.getnode() 返回的值: {uuid.getnode()}") hex_str = hex(uuid.getnode()) print(hex_str) #0xc778cf43dc10
有时候会遇到使用uuid.getnode()第一天与第二天得到的id不同,导致又要激活的问题。

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

浙公网安备 33010602011771号