#!/usr/local/bin/python3
__author__ = \'曹植\'
import os
import random
from winreg import OpenKey, HKEY_LOCAL_MACHINE, QueryInfoKey, EnumKey, CloseKey, QueryValueEx, SetValueEx, REG_SZ, \
KEY_ALL_ACCESS, KEY_WOW64_64KEY
import sys
import ctypes
mackey = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}"
def readipconfig():
"""
# 读取ipconfig信息,列出当前网卡地址,主机名
:return:
"""
s = \'描述\'
t = "物理地址"
h = \'主机名\'
macfact = {}
description = []
address = []
for line in os.popen("ipconfig /all"):
if h in line:
macfact[\'host\'] = line.split(\':\')[1].strip()
if s in line:
description.append(line.split(\':\')[1].strip())
if t in line:
address.append(line.split(\':\')[1].strip())
for des in description:
macfact[des] = address[description.index(des)]
print(\'macfact:\', macfact)
return macfact
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 value in ethernetname:
mackeylist.append(t)
print(\'%s: %s MAC:%s\' % (t, value, ethernetname[value]))
else:
pass
except:
value = \'None\'
CloseKey(key)
# print(keylist)
print(mackeylist)
judge = True
while judge:
d = input(\'请从上面选择您的网卡号(注意按格式填写每行冒号前的数字):\')
if d in mackeylist:
judge = False
else:
print("输入错误,重新输入!")
return d
def modify_mac(newmac): # 修改mac地址
mackey_fix = mackey + \'\\\' + newmac
# print(mackey_fix)
if is_admin():
key = OpenKey(HKEY_LOCAL_MACHINE, mackey_fix, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS)
name = \'mac\'
inputmac = yield_mac(name)
print(\'您输入的新MAC地址是%s\' % inputmac)
SetValueEx(key, "NetworkAddress", 0, REG_SZ, inputmac) # 设置注册表值
print(\'MAC地址已修改成功,重启后生效。\')
CloseKey(key)
else:
print(\'该用户没有权限\')
def modify_host():
"""
修改主机名
:param :
:return:
"""
path = \'SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\'
key = OpenKey(HKEY_LOCAL_MACHINE, path, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS)
name = \'host\'
input_host = yield_mac(name)
print(\'修改后的主机名为:\', input_host)
SetValueEx(key, "NV HostName", 0, REG_SZ, input_host)
def yield_mac(n):
"""
随机生成mac地址
:return:
"""
char_list = [\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'A\', \'B\', \'C\', \'D\', \'E\', \'F\', \'a\', \'b\', \'c\', \'d\',
\'e\',
\'f\']
if n == \'mac\':
char = \'\'.join(random.sample(char_list, 12))
else:
char = \'\'.join(random.sample(char_list, 6))
return char
def is_admin():
"""
Checks if the script is running with administrative privileges.
Returns True if is running as admin, False otherwise.
:return:
"""
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if __name__ == \'__main__\':
if is_admin():
if sys.platform == "win32":
iplist = readipconfig()
m = readinfo(iplist)
modify_host()
modify_mac(m)
else:
print("不支持当前系统")
else:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
若出现访问被拒绝的问题,可以在管理员windows powershell下运行代码。