需求:在筆記本電腦於不同網路環境 (學校/家裡) 之間快速切換固定 IP 與 DHCP。Python 腳本掃描註冊表找到網卡介面卡 GUID,修改 Tcpip\Parameters\Interfaces\{GUID} 下相關鍵值實現切換。
HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318} 找 LowerRange == 'ethernet' 的子鍵,取得 NetCfgInstanceId。HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID} 寫入鍵值。EnableDHCP=0, IPAddress, SubnetMask, DefaultGateway, NameServer。EnableDHCP=1 並清除靜態相關鍵值。
import _winreg, ConfigParser
# 1. 尋找網卡 GUID
hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
r'SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}')
for i in range(_winreg.QueryInfoKey(hkey)[0]):
subkey_name = _winreg.EnumKey(hkey, i)
subkey = _winreg.OpenKey(hkey, subkey_name)
try:
ndi = _winreg.OpenKey(subkey, r'Ndi\Interfaces')
if _winreg.QueryValueEx(ndi, 'LowerRange')[0] == 'ethernet':
guid = _winreg.QueryValueEx(subkey, 'NetCfgInstanceId')[0]
break
except WindowsError:
pass
# 2. 修改 IP 設定
ip_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
r'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\' + guid,
0, _winreg.KEY_WRITE)
# 靜態 IP
_winreg.SetValueEx(ip_key, 'EnableDHCP', 0, _winreg.REG_DWORD, 0)
_winreg.SetValueEx(ip_key, 'IPAddress', 0, _winreg.REG_MULTI_SZ, [ip])
_winreg.SetValueEx(ip_key, 'SubnetMask', 0, _winreg.REG_MULTI_SZ, [mask])
_winreg.SetValueEx(ip_key, 'DefaultGateway', 0, _winreg.REG_MULTI_SZ, [gw])
_winreg.SetValueEx(ip_key, 'NameServer', 0, _winreg.REG_SZ, ','.join([dns1, dns2]))
# DHCP 恢復
_winreg.SetValueEx(ip_key, 'EnableDHCP', 0, _winreg.REG_DWORD, 1)
# 清除 T1, T2, NameServer, DhcpConnForceBroadcastFlag, Lease...
[school]
IPAddress = 192.168.1.100
SubnetMask = 255.255.255.0
GateWay = 192.168.1.1
DNSServer1 = 8.8.8.8
DNSServer2 = 8.8.4.4
netsh interface set interface "區域連線" disable/enable) 或重開機。netsh 或 PowerShell Cmdlet (Set-NetIPAddress) 替代直接改註冊表。此腳本展示 Python 操作 Windows 註冊表自動化網路配置的實戰技巧。