设为首页 收藏本站
查看: 1105|回复: 0

[经验分享] python利用_winreg模块制作MAC地址修改工具

[复制链接]

尚未签到

发表于 2015-4-28 07:25:32 | 显示全部楼层 |阅读模式
  通过百度搜索知道,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.iyunv.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.iyunv.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 "不支持当前系统"

  


  运行结果如下:
DSC0000.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61319-1-1.html 上篇帖子: python 三目运算 下篇帖子: 【Python开发web】(2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表