zoukankan      html  css  js  c++  java
  • 用Python修改本机适配器信息

    主要参考来自【用Python干实事(一)自动修改Windows的IP、网关和DNS设置】。

    使用_winreg模块来操作注册表实现相关信息的修改,它是python的内置模块。也可以通过Win32 Extension For Python的wmi模块来实现.

    主要用到函数如下:

    1.读取注册表

    _winreg.OpenKey(key,sub_key,res=0,sam=KEY_READ)

    2.枚举当前打开Key的SubKey

    _winreg.EnumKey(key, index)

    3.查询当前Key的Value和Data

    _winreg.QueryValueEx(key, value_name)

    4.设置当前key,type下的Value_name的值为value

    _winreg.SetValueEx(key, value_name, reserved, type, value)

    5.关闭按当前key

    _winreg.CloseKey(hkey)

    后面输入IP使用正则表达式来进行格式的判断,正则表达式来自【判断IP与MAC地址的正则表达式!!】,运行涉及到修改注册表需要管理员权限。

    完整的源代码如下:

      1 #-*- encoding:utf-8 -*-
      2 import _winreg, os, sys, re
      3 from ctypes import *
      4 
      5 #更改系统默认编码
      6 reload(sys)   
      7 sys.setdefaultencoding('utf8') 
      8 
      9 NetDescList = []
     10 netCfgInstanceIDList = []
     11 mac_key = r'SYSTEMCurrentControlSetControlClass{4d36e972-e325-11ce-bfc1-08002be10318}'
     12 
     13 #正则检验输入IP地址是否合法
     14 def ipFormatChk(ip_str):
     15     pattern = r"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"
     16     if re.match(pattern, ip_str):
     17         return True
     18     else:
     19         return False
     20 
     21 #从注册表读取相关适配器信息
     22 def ReadNetworkInfo():
     23     hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, mac_key)
     24     keyInfo = _winreg.QueryInfoKey(hkey)
     25     #遍历当前Key的子键
     26     for index in range(keyInfo[0]):
     27         hSubkeyName = _winreg.EnumKey(hkey, index)
     28         try:
     29             hSubKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, mac_key+'\'+hSubkeyName)
     30             hNdiInfKey = _winreg.OpenKey(hSubKey, r'NdiInterfaces')
     31             lowerRange = _winreg.QueryValueEx(hNdiInfKey, 'LowerRange')
     32             #找到以太网
     33             if lowerRange[0] == 'ethernet':
     34                 value, type = _winreg.QueryValueEx(hSubKey, 'DriverDesc')
     35                 NetDescList.append(value)
     36                 netCfgInstanceIDList.append(_winreg.QueryValueEx(hSubKey, 'NetCfgInstanceID')[0])
     37             _winreg.CloseKey(hNdiInfKey)
     38             _winreg.CloseKey(hSubKey)
     39         except :
     40             pass
     41     _winreg.CloseKey(hkey)
     42 
     43 #修改相关网络信息
     44 def ChangeNetWorkInfo():
     45     if len(netCfgInstanceIDList) == 0:
     46         print 'Cannot Find Net Info'
     47         return
     48     ok = False
     49     while not ok:
     50         
     51         for index in range(len(NetDescList)):
     52             print '-----'+str(index)+'. '+NetDescList[index]+'-----'
     53 
     54         #选择需要修改的网卡
     55         ch = raw_input('Please Select: ')
     56         if not ch.isdigit() or int(ch) >= len(NetDescList) or int(ch) < 0:
     57             print 'Select Error!
    '
     58             continue
     59         
     60         KeyName = r'SYSTEMCurrentControlSetServicesTcpipParametersInterfaces'+'\'+str(netCfgInstanceIDList[int(ch)])
     61         #这里需要管理员权限才可以
     62         key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, KeyName, 0, _winreg.KEY_ALL_ACCESS)
     63         
     64         ipAddressList = []
     65         subnetMaskList = []
     66         gateWayList = []
     67         dnsServerList = []
     68 
     69         while True:
     70             ipAddress = raw_input('IP Address: ')
     71             if ipFormatChk(ipAddress):
     72                 ipAddressList.append(ipAddress)
     73                 break;
     74             else:
     75                 print 'Input Format Error'
     76 
     77         while True:
     78             subnetMask = raw_input('Subnet Mask: ')
     79             if ipFormatChk(subnetMask):
     80                 subnetMaskList.append(subnetMask)
     81                 break;
     82             else:
     83                 print 'Input Format Error'
     84 
     85         while True:
     86             gateWay = raw_input('GateWay: ')
     87             if ipFormatChk(gateWay):
     88                 gateWayList.append(gateWay)
     89                 break;
     90             else:
     91                 print 'Input Format Error'
     92         
     93         while True:
     94             dnsServer = raw_input('DNS Server: ')
     95             if ipFormatChk(dnsServer):
     96                 dnsServerList.append(dnsServer)
     97                 break;
     98             else:
     99                 print 'Input Format Error'
    100         
    101         while True:
    102             dnsServerBak = raw_input('Standby DNS Server: ')
    103             if ipFormatChk(dnsServerBak) or dnsServerBak == '':
    104                 if dnsServerBak != '':
    105                     dnsServerList.append(dnsServerBak)
    106                 break;
    107             else:
    108                 print 'Input Format Error'
    109         try:
    110             _winreg.SetValueEx(key, 'IPAddress', None, _winreg.REG_MULTI_SZ, ipAddressList)    
    111             _winreg.SetValueEx(key, 'SubnetMask', None, _winreg.REG_MULTI_SZ, subnetMaskList)
    112             _winreg.SetValueEx(key, 'DefaultGateway', None, _winreg.REG_MULTI_SZ, gateWayList)
    113             _winreg.SetValueEx(key, 'NameServer', None, _winreg.REG_SZ,  ','.join(dnsServerList))
    114         except:
    115             print 'Set Network Info Error'
    116             exit()
    117         _winreg.CloseKey(key)
    118 
    119         # 调用DhcpNotifyConfigChange函数通知IP被修改
    120         DhcpNotifyConfigChange = windll.dhcpcsvc.DhcpNotifyConfigChange
    121         inet_addr = windll.Ws2_32.inet_addr
    122         # DhcpNotifyConfigChange 函数参数列表:
    123           # LPWSTR lpwszServerName,  本地机器为None
    124           # LPWSTR lpwszAdapterName, 网络适配器名称
    125           # BOOL bNewIpAddress,      True表示修改IP
    126          # DWORD dwIpIndex,         表示修改第几个IP, 从0开始
    127           # DWORD dwIpAddress,       修改后的IP地址
    128           # DWORD dwSubNetMask,      修改后的子码掩码
    129           # int nDhcpAction          对DHCP的操作, 0 - 不修改, 1 - 启用, 2 - 禁用
    130           DhcpNotifyConfigChange(None, 
    131                         netCfgInstanceIDList[int(ch)], 
    132                         True, 
    133                         0, 
    134                         inet_addr(ipAddressList[0]), 
    135                         inet_addr(subnetMaskList[0]), 
    136                         0)
    137           ok = True
    138 
    139 if __name__ == '__main__':
    140     try:
    141         ReadNetworkInfo()
    142         ChangeNetWorkInfo()
    143         print 'Set Network Info OK'
    144     except:
    145         print 'Require Administrator Permission'

    参考来源:

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

    用Python干实事(一)自动修改Windows的IP、网关和DNS设置

    判断IP与MAC地址的正则表达式!!

  • 相关阅读:
    图论集合
    无向连通图求割点(tarjan算法去掉改割点剩下的联通分量数目)
    河南省第七届ACM程序设计大赛总结
    单源最短路(spfa),删边求和
    最小圆覆盖
    二分图最大独立集
    二分图最少路径覆盖
    二分图最少点覆盖
    二分图最大匹配(匈牙利算法)
    最小费用最大流模板题
  • 原文地址:https://www.cnblogs.com/tiny656/p/3562123.html
Copyright © 2011-2022 走看看