python利用_winreg模塊制作MAC地址修改工具


     通過百度搜索知道,xp下修改MAC地址的方法主要有兩個,一種是通過配置本地鏈接屬性來實現,這種方法不適合用程序來完成,另一種是通過修改注冊表來完成,本程序主要是利用了這種方法。

    具體方法:Windows 2000/XP中,打開注冊表編輯器:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\4D36E972-E325-11CE-BFC1-08002BE10318 中的0000,0001,0002等子鍵,如果在某一子鍵下找到DriverDesc值 ,該值與你要改的網卡一致,那么就在該鍵下添加一個字符串變量,命名為“NetworkAddress”,值為要設置的MAC地址,例如:000102030405,然后重啟機器就可以實現。

    根據這一方法,利用python內置的winreg模塊對注冊表進行操作。

    第一步,讀取當前物理網卡的MAC地址。python獲取MAC地址的方法有兩個,具體請見Jerry.Kwan的博文:http://www.cnblogs.com/Jerryshome/archive/2011/11/30/2269365.html。本程序采用了第二種方法,並為了后面注冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\4D36E972-E325-11CE-BFC1-08002BE10318 下鍵值與網卡對應方便,這里將網卡名稱和當前MAC地址保存為字典形式,鍵為網卡名稱,Value為MAC地址。具體代碼如下:

def readipconfig():#讀取ipconfig信息,列出當前網卡地址
    t="Physical Address"
    u="Description"
    keyphy=''
    macfact={}
    for line in os.popen("ipconfig /all"):
        if u in line:
            keyphy=line.split(":")[1].strip()
        if keyphy !='' and (t in line):
            macfact[keyphy]=line.split(":")[1].strip()
    
    return macfact

    第二步,讀取當前機器上的網卡等設備信息,找出其中的網卡,並選擇要修改的設備(有時一台機器會有多個網卡,可以選擇修改某一網卡的MAC).HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\4D36E972-E325-11CE-BFC1-08002BE10318 子鍵一般包括0000、0001、0002……,每個子鍵對應的硬件設備不同,一般其名稱保存在DriverDesc值。這里首先讀出當前機器上的網絡設備,然后與第一步中得到的macfact字典進行對比,找出當前所使用的各個網卡對應的子子鍵值,並要求輸入要修改的網卡對應的子鍵值。從而確定要修改哪一個網卡的MAC。

def readinfo(ethernetname):#讀取當前網絡設備並選擇要修改的設備
    
    key=OpenKey(HKEY_LOCAL_MACHINE, mackey)
    countkey=QueryInfoKey(key)[0]
    keylist=[]#獲取{4D36E972-E325-11CE-BFC1-08002bE10318}子鍵列表
    mackeylist=[]
    
    for i in range(int(countkey)):
        name=EnumKey(key,i) #獲取子鍵名
        keylist.append(name)
    CloseKey(key)
    
    for t in keylist:
        mackey_zi=mackey+'\\'+t
    
        try:
            key=OpenKey(HKEY_LOCAL_MACHINE, mackey_zi)
        #print key
            value,type=QueryValueEx(key,"DriverDesc")
            #列出有mac地址的網卡,及對應注冊表中的編號    
            if ethernetname.has_key(value):
                mackeylist.append(t)
                print '%s: %s  MAC:%s' %(t,value,ethernetname[value])
            else:
                pass
        except:
            value='None'
    CloseKey(key)
    judge=True
    while judge:
        d=raw_input('請從上面選擇您的網卡號(注意按格式填寫每行冒號前的數字):')
        if d in mackeylist:
            judge=False
        else:
            print "輸入錯誤,重新輸入!"
    return d

    第三步,修改mac地址。方法比較簡單,利用winreg.OpenKey()打開該網卡所對應注冊表中的鍵,SetValueEx(key,"NetworkAddress",0,REG_SZ,inputmac)用來修改該鍵下的值,如果該鍵下存在NETworkAddress,那么將修改原來的值,如果不存在,則會新建一個名為NetworkAddress的字符串值。

def modifymac(newmac):#修改mac地址
    mackey_fix=mackey+'\\'+newmac
    key=OpenKey(HKEY_LOCAL_MACHINE, mackey_fix,0,KEY_ALL_ACCESS)
    
    judge=True
    while judge:
        inputmac=raw_input('請輸入修改后的MAC地址:(如“011D00003F21”):')
        mjudge=judgemac(inputmac)
        if len(inputmac)==12 and  mjudge==True:
            judge=False
    print '您輸入的新MAC地址是%s' %inputmac       
    SetValueEx(key,"NetworkAddress",0,REG_SZ,inputmac)#設置注冊表值
    print 'MAC地址已修改成功,重啟后生效。'
    CloseKey(key)
    
def judgemac(inputmac):#判斷輸入的mac地址是否合法
    judgechar=True
    charlist=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','a','b','c','d','e','f']
    for char_i in inputmac:
        if char_i not in charlist:
            print 'MAC地址格式錯誤,請重新輸入。'
            judgechar=False
            break
    return judgechar

    通過以上三步,完成了XP下網卡MAC地址的修改工作,此次只是在 XP機器測試通過,應該2000也可以,但沒有具體試過。完整的代碼如下:

# -*- coding: cp936 -*-
'''
MAC地址修改器for xp V1.0
小五義:http://www.cnblogs.com/xiaowuyi 
'''

from _winreg import *
import sys
import os
mackey="SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}"

def readinfo(ethernetname):#讀取當前網絡設備並選擇要修改的設備
    
    key=OpenKey(HKEY_LOCAL_MACHINE, mackey)
    countkey=QueryInfoKey(key)[0]
    keylist=[]#獲取{4D36E972-E325-11CE-BFC1-08002bE10318}子鍵列表
    mackeylist=[]
    
    for i in range(int(countkey)):
        name=EnumKey(key,i) #獲取子鍵名
        keylist.append(name)
    CloseKey(key)
    
    for t in keylist:
        mackey_zi=mackey+'\\'+t
    
        try:
            key=OpenKey(HKEY_LOCAL_MACHINE, mackey_zi)
        #print key
            value,type=QueryValueEx(key,"DriverDesc")
            #列出有mac地址的網卡,及對應注冊表中的編號    
            if ethernetname.has_key(value):
                mackeylist.append(t)
                print '%s: %s  MAC:%s' %(t,value,ethernetname[value])
            else:
                pass
        except:
            value='None'
    CloseKey(key)
    judge=True
    while judge:
        d=raw_input('請從上面選擇您的網卡號(注意按格式填寫每行冒號前的數字):')
        if d in mackeylist:
            judge=False
        else:
            print "輸入錯誤,重新輸入!"
    return d

def readipconfig():#讀取ipconfig信息,列出當前網卡地址
    t="Physical Address"
    u="Description"
    keyphy=''
    macfact={}
    for line in os.popen("ipconfig /all"):
        if u in line:
            keyphy=line.split(":")[1].strip()
        if keyphy !='' and (t in line):
            macfact[keyphy]=line.split(":")[1].strip()
    
    return macfact
    

def modifymac(newmac):#修改mac地址
    mackey_fix=mackey+'\\'+newmac
    key=OpenKey(HKEY_LOCAL_MACHINE, mackey_fix,0,KEY_ALL_ACCESS)
    
    judge=True
    while judge:
        inputmac=raw_input('請輸入修改后的MAC地址:(如“011D00003F21”):')
        mjudge=judgemac(inputmac)
        if len(inputmac)==12 and  mjudge==True:
            judge=False
    print '您輸入的新MAC地址是%s' %inputmac       
    SetValueEx(key,"NetworkAddress",0,REG_SZ,inputmac)#設置注冊表值
    print 'MAC地址已修改成功,重啟后生效。'
    CloseKey(key)
    
def judgemac(inputmac):#判斷輸入的mac地址是否合法
    judgechar=True
    charlist=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','a','b','c','d','e','f']
    for char_i in inputmac:
        if char_i not in charlist:
            print 'MAC地址格式錯誤,請重新輸入。'
            judgechar=False
            break
    return judgechar

if __name__=='__main__':

    if sys.platform=="win32":
        iplist=readipconfig()
        m=readinfo(iplist)
        modifymac(m)
    else:
        print "不支持當前系統"
      
    

 

運行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM