web-dev-qa-db-ja.com

WindowsおよびLinuxのPythonで一意のコンピューターIDを取得します

WindowsとLinuxでPythonを使用して、コンピュータに固有のIDを取得したい。CPUID、マザーボードのシリアルなど...

私は運が悪くいくつかのモジュール(pycpuid、psi、...)を見ました。

それを行う方法について何か考えはありますか?

32
darkpotpot

MACアドレスを一意のIDとして使用してみませんか?

ここでの議論 Pythonを使用してデバイスからMACアドレスを取得する は、MACアドレスを取得する方法を示しています

0
Jay Zhu

これを行う直接的な「Python」の方法はないようです。最近のPCハードウェアでは、通常、BIOSにUUIDが保存されています-Linuxでは、これを読み取ることができるコマンドラインユーティリティdmidecodeがあります。私のデスクトップからの例:

System Information
        Manufacturer: Dell Inc.
        Product Name: OptiPlex 755                 
        Version: Not Specified
        Serial Number: 5Y8YF3J
        UUID: 44454C4C-5900-1038-8059-B5C04F46334A
        Wake-up Type: Power Switch
        SKU Number: Not Specified
        Family: Not Specified

MACアドレスの問題は、通常簡単にプログラムで変更できることです(少なくともVMでOSを実行している場合)。

Windowsでは、これを使用できます C API

14
Kimvais

windowsの場合DmiDecode for Windowslink ):

subprocess.Popen('dmidecode.exe -s system-uuid'.split())

linux(非root)の場合:

subprocess.Popen('hal-get-property --udi /org/freedesktop/Hal/devices/computer --key system.hardware.uuid'.split())
11
nazca

Python3.6およびWindowsの場合、デコードを使用する必要があります

>>> import subprocess
... current_machine_id = subprocess.check_output('wmic csproduct get uuid').decode().split('\n')[1].strip()
... print(current_machine_id)
9

または、サブプロセスを使用したくない場合は(遅い)ctypesを使用します。これはLinuxの非root用です。

import ctypes
from ctypes.util import find_library
from ctypes import Structure

class DBusError(Structure):
    _fields_ = [("name", ctypes.c_char_p),
                ("message", ctypes.c_char_p),
                ("dummy1", ctypes.c_int),
                ("dummy2", ctypes.c_int),
                ("dummy3", ctypes.c_int),
                ("dummy4", ctypes.c_int),
                ("dummy5", ctypes.c_int),
                ("padding1", ctypes.c_void_p),]


class HardwareUuid(object):

    def __init__(self, dbus_error=DBusError):
        self._hal = ctypes.cdll.LoadLibrary(find_library('hal'))
        self._ctx = self._hal.libhal_ctx_new()
        self._dbus_error = dbus_error()
        self._hal.dbus_error_init(ctypes.byref(self._dbus_error))
        self._conn = self._hal.dbus_bus_get(ctypes.c_int(1),
                                            ctypes.byref(self._dbus_error))
        self._hal.libhal_ctx_set_dbus_connection(self._ctx, self._conn)
        self._uuid_ = None

    def __call__(self):
        return self._uuid

    @property
    def _uuid(self):
        if not self._uuid_:
            udi = ctypes.c_char_p("/org/freedesktop/Hal/devices/computer")
            key = ctypes.c_char_p("system.hardware.uuid")
            self._hal.libhal_device_get_property_string.restype = \
                                                            ctypes.c_char_p
            self._uuid_ = self._hal.libhal_device_get_property_string(
                                self._ctx, udi, key, self._dbus_error)
        return self._uuid_

これは次のように使用できます。

get_uuid = HardwareUuid()
print get_uuid()
6
Six

これを行うための信頼できるクロスプラットフォームの方法はないと思います。私は、ハードウェアエラーレポートの形式としてMACアドレスを変更する1つのネットワークデバイスを知っています。これが失敗する可能性のある原因は他にもたくさんあります。

信頼できる唯一のソリューションは、アプリケーションが各マシンに一意のキーを割り当てることです。はい、なりすましの可能性がありますが、完全に壊れる心配はありません。スプーフィングが心配な場合は、ある種のヒューリスティック(MACアドレスの変更など)を適用して、キーが移動されたかどうかを確認できます。

UPDATE:細菌のフィンガープリント を使用できます。

5
mikerobi

シェルで、またはPythonのパイプを介してこれらのいずれかを起動して、Apple OS X> = 10.5を実行しているマシンのシリアル番号を取得します。

/usr/sbin/system_profiler SPHardwareDataType | fgrep 'Serial' | awk '{print $NF}'

または

ioreg -l | awk '/IOPlatformSerialNumber/ { print $4 }' | sed s/\"//g

ところで、MACアドレスは良い考えではありません。1つのマシンに1つ以上のネットワークカードが存在する可能性があり、MACアドレスは なりすまし である可能性があります。

5
Laryx Decidua

おかしい!ただし、id.getnodedmidecode.exeと同じ値を返します。

subprocess.Popen('dmidecode.exe -s system-uuid'.split())

00000000-0000-0000-0000-001FD088565A

import uuid    
uuid.UUID(int=uuid.getnode())

UUID('00000000-0000-0000-0000-001fd088565a')
5
3
Pratik Deoghare

これはWindowsで動作するはずです:

import subprocess
current_machine_id = subprocess.check_output('wmic csproduct get uuid').split('\n')[1].strip()
1
Souvik

使用している別のものが見つかりました。 Linux用のMacアドレス、Windows用のMachineGuid、そしてMac用のものもあります。

詳細はこちら: http://www.serialsense.com/blog/2011/02/generating-unique-machine-ids/

1
darkpotpot