使用 Python 获取唯一的硬件 ID

Getting a unique hardware ID with Python

我有一个过程需要我识别不同的机器,但我不确定什么是最好的方法。 我不想将该 ID 保存在文本文件或其他内容中,但我想在每次需要时从硬件生成它(以防带有 ID 的文本被删除或其他内容)

我已经检查过 UUID,似乎还可以,但我不确定。 我看过 uuid.getNode(),但我有 2 个问题:

  1. 一部分说 "If all attempts to obtain the hardware address fail, we choose a random 48-bit number with its eighth bit set to 1 as recommended in RFC 4122",这意味着我可能由于某种原因在某些系统上获得不同的唯一性 - 有没有办法确定它失败的时间并生成其他东西?

  2. 另一部分说:““硬件地址”是指网络接口的 MAC 地址,在具有多个网络接口的机器上,任何一个的 MAC 地址它们中的一部分可能会被退回。”,这意味着如果我有 2 个不同的网络适配器,每次调用我可能会得到其中的任何一个?那对我不好。

如果您有更好的方法来获取机器的唯一 ID,我每次都可以生成该 ID,而不必担心删除它或其他问题 - 我很乐意听到。我所有寻找东西的尝试都失败了。 谢谢

你可以使用 dmidecode.

Linux:

import subprocess

def get_id():
    return subprocess.Popen('hal-get-property --udi /org/freedesktop/Hal/devices/computer --key system.hardware.uuid'.split())

Windows:
注意:需要 dmidecode for Windows

import subprocess

def get_id():
    return subprocess.Popen('dmidecode.exe -s system-uuid'.split())

跨平台:
注意:需要 dmidecode for Windows

import subprocess
import os

def get_id():
    if 'nt' in os.name:
        return subprocess.Popen('dmidecode.exe -s system-uuid'.split())
    else:
        return subprocess.Popen('hal-get-property --udi /org/freedesktop/Hal/devices/computer --key system.hardware.uuid'.split())

请注意,您可以从 Windows 获取相同的 UUID,而无需使用以下命令安装任何其他软件:

C:\> wmic csproduct get uuid

对于 windows 这似乎每次从每个基于 MAC 地址的设备获得相同的 uuid:

str(uuid.uuid1(uuid.getnode(),0))[24:]

但它似乎没有在 Android 4.4.2.

上保持相同的 ID

或使用 bios serialnr

wmic bios get serialnumber

我采用的理想方法是这样的。它非常快速和高效。

hwid = str(subprocess.check_output(
    'wmic csproduct get uuid')).split('\r\n')[1].strip('\r').strip()
data = requests.get(
    'https://gist.githubusercontent.com/rishav394/z/raw/x')
if hwid in data.text:
    print('Authenticated!')
    auth = True
else:
    print(hwid + ' was not found on the server.\nNot authorised!')

这对我有用:

import subprocess

current_machine_id = str(subprocess.check_output('wmic csproduct get uuid'), 'utf-8').split('\n')[1].strip()

print(current_machine_id)