24小时热门版块排行榜    

Znn3bq.jpeg
查看: 1218  |  回复: 1

mybag1

木虫 (正式写手)

[交流] python利用_winreg模块制作MAC地址修改工具 已有1人参与

通过百度搜索知道,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 "不支持当前系统"
      
   
原贴已发在:http://www.cnblogs.com/xiaowuyi/archive/2012/04/11/2442793.html
回复此楼
http://www.cnblogs.com/xiaowuyi
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangybcn

禁虫 (正式写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
本帖内容被屏蔽

2楼2012-05-03 17:29:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 mybag1 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 a2tycdlnq1 2026-05-23 5/250 2026-05-24 16:21 by hhx1yx9evi
[论文投稿] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 a2tycdlnq1 2026-05-23 4/200 2026-05-24 16:16 by hhx1yx9evi
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 pmo95bazuy 2026-05-23 8/400 2026-05-24 15:56 by 1uy1ht2y9r
[基金申请] 西安交大新媒学院副院长用撤稿论文结题 +3 bjvtcliu 2026-05-24 5/250 2026-05-24 10:16 by kudofaye
[教师之家] 论文撤稿了 +3 bjvtcliu 2026-05-24 5/250 2026-05-24 10:06 by Equinoxhua
[教师之家] 某211大学教师把个人教师官方主页改成:我跑了我跑了我跑了!官宣跑路! +4 zju2000 2026-05-21 5/250 2026-05-24 09:35 by songwz
[考博] 26/27申博自荐 10+4 ZXW0202 2026-05-22 9/450 2026-05-24 08:47 by bjvtcliu
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 hvkbtfonbv 2026-05-23 3/150 2026-05-24 08:01 by 9ps9vgkqva
[基金申请] 揭秘青基评审内幕:几个A才能顺利中标 +3 国自然国社科中 2026-05-23 4/200 2026-05-23 15:37 by 2000zf36392
[基金申请] 青B发送上会通知了吗 +5 chemBioBro 2026-05-22 7/350 2026-05-23 12:35 by zhuifengzhy
[考博] 博士申请 +3 焦晓明 2026-05-21 3/150 2026-05-23 11:26 by mlc840311
[论文投稿] 投稿求助,期刊 +4 希冀,有书读 2026-05-20 8/400 2026-05-22 10:16 by 希冀,有书读
[文学芳草园] 献血感触 +7 呀呀好傻 2026-05-19 13/650 2026-05-21 20:15 by 呀呀好傻
[基金申请] 国自然评分 +4 无名者登山 2026-05-20 5/250 2026-05-21 16:35 by swuq
[基金申请] 提交了我也来说说感想 +9 fummck 2026-05-20 10/500 2026-05-21 14:17 by draco1987
[基金申请] 评审有感 +15 popular289 2026-05-18 26/1300 2026-05-21 10:35 by 西葫芦炒鸡蛋
[有机交流] 反应很差,大量原料没有反应 5+3 Mr.Zot 2026-05-19 8/400 2026-05-20 22:19 by Equinoxhua
[考博] 如果工作了想读博,可以边工作边读全日制嘛? 30+3 铁达火车 2026-05-18 5/250 2026-05-20 09:33 by tfang
[考博] 博士申请 +5 星…… 2026-05-18 6/300 2026-05-18 23:49 by 糊糊涂涂好
[硕博家园] 我在等一个没有答案的答案 +3 Love_MH 2026-05-17 3/150 2026-05-18 02:22 by 竹林孤影
信息提示
请填处理意见