zoukankan      html  css  js  c++  java
  • 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 "不支持当前系统"
          
        

    运行结果如下:

  • 相关阅读:
    InnoDB和MyISAM区别
    include和require的区别
    php的魔术方法
    php中heredoc的使用方法
    20条常见的编码陷阱
    php header 跳转
    php.ini设置详解
    session的实现原理 大网站应用应注意的问题
    Ruby on Rails 开发实践相关命令参考
    IBM WebSphere Portal6 最佳项目实践
  • 原文地址:https://www.cnblogs.com/xiaowuyi/p/2442793.html
Copyright © 2011-2022 走看看