使用 Python 获取唯一的硬件 ID
Getting a unique hardware ID with Python
我有一个过程需要我识别不同的机器,但我不确定什么是最好的方法。
我不想将该 ID 保存在文本文件或其他内容中,但我想在每次需要时从硬件生成它(以防带有 ID 的文本被删除或其他内容)
我已经检查过 UUID,似乎还可以,但我不确定。
我看过 uuid.getNode(),但我有 2 个问题:
一部分说 "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",这意味着我可能由于某种原因在某些系统上获得不同的唯一性 - 有没有办法确定它失败的时间并生成其他东西?
另一部分说:““硬件地址”是指网络接口的 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)
我有一个过程需要我识别不同的机器,但我不确定什么是最好的方法。 我不想将该 ID 保存在文本文件或其他内容中,但我想在每次需要时从硬件生成它(以防带有 ID 的文本被删除或其他内容)
我已经检查过 UUID,似乎还可以,但我不确定。
我看过 uuid.getNode(),但我有 2 个问题:
一部分说 "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",这意味着我可能由于某种原因在某些系统上获得不同的唯一性 - 有没有办法确定它失败的时间并生成其他东西?
另一部分说:““硬件地址”是指网络接口的 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)