Getting a unique hardware ID with Python

29,550

Solution 1

You could use 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:
NOTE: Requires dmidecode for Windows

import subprocess

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

Cross-platform:
NOTE: Requires 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())

Solution 2

Please note that you can get the same UUID from Windows without installing any additional software with the following command:

C:\> wmic csproduct get uuid

Solution 3

For windows this seems to get same uuid every time por each device based on the MAC address:

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

But it does not seem to keep same ID on Android 4.4.2.

Solution 4

This worked for me:

import subprocess

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

print(current_machine_id)

Solution 5

The ideal approach which I resorted to was this. It is quite fast and efficient.

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!')
Share:
29,550
TzurEl
Author by

TzurEl

Updated on April 06, 2021

Comments

  • TzurEl
    TzurEl about 3 years

    I have a process that requires me to identify different machines, and I'm not sure what's the best way to do it. I do not want to save that ID on a text file or something, but I want to generate it from hardware every time I need it (in case the text with the ID gets deleted or something)

    I've checked UUID, and it seems ok but I'm not sure. I've taken a look at uuid.getNode(), but I have 2 problems with it:

    1. One part says "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", which means that I may get a different unique on some systems for some reason - is there a way to identify which time it failed and generate something else?

    2. another part says: " “Hardware address” means the MAC address of a network interface, and on a machine with multiple network interfaces the MAC address of any one of them may be returned.", which means if i have 2 different network adapters, each call I may get any one of them? that's not good for me.

    If you have a better way of obtaining a unique ID for a machine, that I can generate each time and won't have to worry about deletion of it or something - I'd be glad to hear it. all of my attempts to find something have failed. Thanks.

  • TzurEl
    TzurEl almost 8 years
    Thank you! that was very helpful. using dmidecode is an excellent idea. (didn't know this)
  • Souvik
    Souvik almost 7 years
    Use subprocess to run it from your python code: import subprocess current_machine_id = subprocess.check_output('wmic csproduct get uid').split('\n')[1].strip()
  • Mostafa
    Mostafa about 5 years
    CalledProcessError: Command 'wmic csproduct get uid' returned non-zero exit status -2147217385
  • Rishav
    Rishav about 5 years
    Thats a very good answer and even a better comment from Souvik
  • Rishav
    Rishav about 5 years
    Note that hwid is just a name. It is NOT the Hardware ID of your machine.
  • tim
    tim almost 4 years
    Small typo in Souvik comment. Use import subprocess current_machine_id = subprocess.check_output('wmic csproduct get uuid').split('\n')[1].strip() (uuid instead of uid) :-)
  • VPfB
    VPfB over 3 years
    Linux update 2020: HAL is ancient Linux history. Use dmidecode -s system-uuid instead.
  • Ohad Cohen
    Ohad Cohen about 2 years
    for some reason on the same machine but different python versions str(uuid.uuid1(uuid.getnode(),0)) returns different 8 first letters and the others the same, be aware if you want to use the full UUID and use different python versions.