2010-03-17 82 views
17

我想在Windows和Linux上使用Python獲得計算機獨有的id。它可能是CPU ID,主板系列,或其他任何東西。在windows和linux上使用Python獲取唯一的計算機ID

我看着幾個模塊(pycpuid,psi,...)沒有運氣。

任何想法如何做到這一點?

+0

你需要什麼這個_for_? – Kimvais 2010-03-17 18:39:04

+0

我需要這個以便爲我的軟件爲每臺計算機執行許可證系統。我希望許可證對每臺計算機都是唯一的。如果用戶在另一臺計算機上安裝該軟件,並且在該計算機上安裝了* unlocker *,則他應該無法啓動該軟件。 – darkpotpot 2010-03-18 08:48:00

+0

相關http://stackoverflow.com/questions/4193514/get-hard-disk-serial-number-using-python-on-linux和http://stackoverflow.com/questions/227222/how-can-you- extract-hardware-id-using-python – pmav99 2011-11-11 13:56:24

回答

0

如何使用MAC地址作爲唯一的ID?

這裏Obtain MAC Address from Devices using Python討論瞭如何獲取MAC地址

+3

這就是我最初想做的事情,但經過多臺計算機的多次測試後,我發現有時在一臺計算機上有幾個mac地址。 例如,我的一個* test *計算機有一個VPN服務器和一個網卡。我想確保使用網卡的MAC地址,而不是VPN(或其他東西) – darkpotpot 2010-03-17 09:53:47

+1

由於您只想獲得計算機的唯一ID。假設計算機的硬件/軟件配置不會經常更改。通過這種方式,您可以獲得所有網絡適配器的MAC地址,並將它們混合在一起以創建一個ID。這聽起來適合您的要求嗎? – 2010-03-17 10:14:12

+0

是的,它應該工作。我想我會這樣做,直到我找到更好的方式。 – darkpotpot 2010-03-17 10:21:18

2
+5

該模塊提供跨空間和時間的獨特性,如GUID。我不認爲這是他想要的。他想要一種唯一標識計算機的方法(例如用於許可目的),但是隨着時間的推移會一致... – David 2010-03-17 10:14:11

+3

這正是他想要的,但是python模塊沒有做到他想做的 - 他應該從BIOS讀取UUID ,在Linux上''dmidecode | grep UUID'可以訣竅 – Kimvais 2010-03-17 13:46:15

+4

uuid模塊提供了一種通過[uuid.getnode()]獲得MAC地址的簡單方法(https://docs.python.org/2/library/ uuid.html#uuid.getnode)。該文檔說「如果有多個網絡接口,他們中的任何一個都可能會返回」。在我自己的簡短測試中,當它有多個時,它似乎始終如一地返回相同的一個。 – foz 2015-01-27 16:22:22

4

我不認爲這是一個可靠的,跨平臺的,方式做到這一點。我知道一個網絡設備會將其MAC地址作爲硬件錯誤報告的一種形式進行更改,並且還有一百萬種其他方式可能會失敗。

唯一可靠的解決方案是讓您的應用程序爲每臺機器分配一個唯一的密鑰。是的,它可以被欺騙,但你不必擔心它完全崩潰。如果您擔心僞裝,您可以應用某種啓發式方法(如更改mac地址)來嘗試確定密鑰是否已移動。

更新:您可以使用bacterial fingerprinting

+1

細菌指紋參照對這個問題不是有用的答案,我也不認爲這是一個有趣的笑話。 – steveha 2012-07-02 22:54:27

+1

我得到了一個明智的笑聲。 – 2014-09-20 16:27:49

12

似乎沒有這樣做的直接「蟒蛇」方式。在現代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地址的問題是,通常你可以輕鬆編程改變(至少如果你運行在一個虛擬機OS)

在Windows上,你可以使用這C API

+4

請注意,您需要root權限才能讀取Linux上的DMI數據。另外,可以在/ sys/class/dmi/id/product_uuid中找到相同的編號。 – Juliano 2010-03-17 14:33:01

+3

問題是我沒有(也不想使用)我的應用程序中的root權限。 – darkpotpot 2010-03-17 15:45:39

+0

你需要成爲根用戶才能讀取UUID,但是你可以不用root就可以讀取其餘的信息。所有其他非特權的東西都連接在/ sys/class/dmi/id/modalias中。你可以散列。結合mac的散列和cpuid指令的輸出,你有一個相當不錯的系統指紋。 – 2014-02-13 00:03:41

10

適用於Windows,你需要的dmidecode爲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()) 
7

或者,如果你不想使用子,(它很慢)使用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() 
5

調用這些在外殼或通過Python中的管道之一,獲得運行蘋果機的硬件序列號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個網卡,MAC地址可以是spoofed

-2

好笑! 但uuid.getnode返回與dmidecode.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') 
1

這應該工作在Windows上:

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