用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'SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}'
12
13 #正则检验输入IP地址是否合法
14 def ipFormatChk(ip_str):
15 pattern = r"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|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'Ndi\Interfaces')
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!\n'
58 continue
59
60 KeyName = r'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces'+'\\'+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干实事(一)自动修改Windows的IP、网关和DNS设置。
用Python修改本机适配器信息的更多相关文章
- windows下用C++修改本机IP地址
两种方法 第一种.使用DOS命令(即时生效) 第二种.修改注册表(重启生效) 1.打开SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards ...
- python学习之最简单的获取本机ip信息的小程序
文章是从我的个人博客粘贴过来的,大家可以直接访问我的个人博客哦 http://www.iwangzheng.com 获取本机ip信息的命令ifconfig总是在用,这次拿到pyhton代码里,感觉py ...
- [批处理]自动修改本机IP地址
前言 抱着笔记本经常到处跑的人,今天回宿舍上网,明天去机房上网,后面去办公室上网,每到一个地方,都要更换一次IP网关掩码 如果都是DHCP还好,关键是为了组织为了方便管理这些地方都是使用的静态IP,所 ...
- 基于python的堡垒机
一 堡垒机的架构 堡垒机的核心架构通常如下图所示: 二.堡垒机的一般执行流程 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码) 用户登陆堡垒机,输入堡垒机用户名密码,显示当前用户 ...
- Android开发之蓝牙 --修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备
一. 修改本机蓝牙设备的可见性 二. 扫描周围可用的蓝牙设备 一. 清单文件AdroidManifest.xml: <uses-permission android:name="an ...
- 翻译文章“AST 模块:用 Python 修改 Python 代码”---!!注意ironpathyon未实现此功能
https://github.com/upsuper/blog/commit/0214fdd084c4adf2de2ed9912d644fb59ce13a1c +Title: [翻译] AST 模块: ...
- 做一个自动修改本机IP和mac的bat文件
原文:做一个自动修改本机IP和mac的bat文件 1.ip bat修改理论探讨 前两天我突然萌生了一个念头:能不能做一个小程序来实现自动配置或修改IP和mac,达到一键搞定的目的,这样尤其适合那些带着 ...
- Linux修改本机/etc/hosts的hostName
1.Linux修改本机别名/etc/hosts的hostName后经常不生效解决 Linux修改本机别名/etc/hosts的hostName后经常不生效, 比如我们/etc/hosts的内容如下: ...
- python爬虫之User-Agent用户信息
python爬虫之User-Agent用户信息 爬虫是自动的爬取网站信息,实质上我们也只是一段代码,并不是真正的浏览器用户,加上User-Agent(用户代理,简称UA)信息,只是让我们伪装成一个浏览 ...
随机推荐
- 【Java基础】Java8 新特性
Java8 新特性 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁.更灵活的代码. L ...
- JAR冲突问题的解决以及运行状态下如何查看加载的类
今天碰到群里小伙伴问,线上程序好像有多个不同版本的Netty包,怎么去看到底加载了哪一个? 在说如何看之前,先来说说,当你开始意识到项目里有多个不同版本的Jar包,都是因为遇到了这几个异常: java ...
- MySQL select 查询的分页和排序
SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][ ...
- (十三)利用BASE_DIR来import模板
实际工程的组织架构一般是这样的: bin包下的bin.py是实际的执行文件,my_mould包下的是业务逻辑的实现模板 bin.py需要import my_mould下的py文件,而bin和my_mo ...
- dmp文件导入抽取方法
一.确认dmp文件.oracle客户端和服务端的字符集 (1)dmp文件字符集确认: 使用UE打开dmp文件查看文件第2个和第3个字节内容,这两个字节记录了dmp文件的字符集.如0354,然后用以下s ...
- 带你走进memcache,老牌内存缓存技术
一.核心优化概述 什么是优化:以更小的资源支持更大负载网站的运行,以小博大. 思路:尽量减少用户等待时间,节省系统资源开销,节省带宽使用. 优化什么地方?有三方面:Memcache内存缓存技术.静态化 ...
- SQL 语法速成手册
本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理. 一.基本概念 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件). 数 ...
- 太极图HTML+CSS(可旋转)代码记录
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 使用 .NETCore自带框架快速实现依赖注入
Startup 在Startup的ConfigureServices()中配置DI的接口与其实现 public void ConfigureServices(IServiceCollection se ...
- Django 模型(数据库)-cmd下的操作
Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py ...