Respuesta 2019 (para Windows):
Si desea un UUID permanente que identifique una máquina exclusivamente en Windows, puede usar este truco: (Copiado de mi respuesta en https://stackoverflow.com/a/58416992/8874388 ).
from typing import Optional
import re
import subprocess
import uuid
def get_windows_uuid() -> Optional[uuid.UUID]:
try:
# Ask Windows for the device's permanent UUID. Throws if command missing/fails.
txt = subprocess.check_output("wmic csproduct get uuid").decode()
# Attempt to extract the UUID from the command's result.
match = re.search(r"\bUUID\b[\s\r\n]+([^\s\r\n]+)", txt)
if match is not None:
txt = match.group(1)
if txt is not None:
# Remove the surrounding whitespace (newlines, space, etc)
# and useless dashes etc, by only keeping hex (0-9 A-F) chars.
txt = re.sub(r"[^0-9A-Fa-f]+", "", txt)
# Ensure we have exactly 32 characters (16 bytes).
if len(txt) == 32:
return uuid.UUID(txt)
except:
pass # Silence subprocess exception.
return None
print(get_windows_uuid())
Utiliza la API de Windows para obtener el UUID permanente de la computadora, luego procesa la cadena para asegurarse de que sea un UUID válido y, por último, devuelve un objeto Python ( https://docs.python.org/3/library/uuid.html ) que le brinda la comodidad formas de usar los datos (como un entero de 128 bits, una cadena hexadecimal, etc.).
¡Buena suerte!
PD: La llamada de subproceso probablemente podría reemplazarse con ctypes que llamen directamente al kernel de Windows / DLL. Pero para mis propósitos, esta función es todo lo que necesito. Hace una validación fuerte y produce resultados correctos.