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

简介: 通过百度搜索知道,xp下修改MAC地址的方法主要有两个,一种是通过配置本地链接属性来实现,这种方法不适合用程序来完成,另一种是通过修改注册表来完成,本程序主要是利用了这种方法。     具体方法:Windows 2000/XP中,打开注册表编辑器:HKEY_LOCAL_MACHINE\S...

     通过百度搜索知道,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 "不支持当前系统"
      
    

 

运行结果如下:

目录
相关文章
|
7天前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
128 60
|
7天前
|
Python
【10月更文挑战第10天】「Mac上学Python 20」小学奥数篇6 - 一元一次方程求解
本篇将通过 Python 和 Cangjie 双语讲解如何求解一元一次方程。通过这道题,学生将掌握如何用编程实现方程求解,并体验基本的代数计算。
73 1
|
1天前
|
存储 算法 Python
【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
32 3
|
3天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
2天前
|
Python
【10月更文挑战第15天】「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算
本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换,并学会用编程实现坐标变化。
33 1
|
4天前
|
移动开发 数据可视化 Python
【10月更文挑战第13天】「Mac上学Python 24」小学奥数篇10 - 数列求和
本篇将通过 Python 和 Cangjie 双语实现数列求和的计算。通过这个题目,学生将学会如何通过公式法和循环法求解等差数列与等比数列的和。
37 3
|
3天前
|
算法 数据可视化 Python
【10月更文挑战第14天】「Mac上学Python 25」小学奥数篇11 - 最大公约数与最小公倍数
本篇将通过 Python 和 Cangjie 双语实现最大公约数(GCD)和最小公倍数(LCM)的计算。这个题目帮助学生理解如何运用数学算法,并将其与编程实现结合。
23 1
|
8天前
|
Python
【10月更文挑战第9天】「Mac上学Python 17」小学奥数篇3 - 找出神秘数字
本篇将通过 Python 和 Cangjie 双语解决一个有趣的数字谜题,培养学生的数学推理能力以及编程的逻辑思维。
114 7
|
6天前
|
机器学习/深度学习 移动开发 Python
【10月更文挑战第11天】「Mac上学Python 22」小学奥数篇8 - 排列组合计算
本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。
42 4
|
5天前
|
数据可视化 Python
【10月更文挑战第12天】「Mac上学Python 23」小学奥数篇9 - 基础概率计算
本篇将通过 Python 和 Cangjie 双语实现基础概率的计算,帮助学生学习如何解决简单的概率问题,并培养逻辑推理和编程思维。
31 1