Скрипт для изменения IP-адреса на Windows
Я использую свой компьютер для связи с оборудованием через Ethernet. Для связи с этим устройством я установил свой ip на 192 168 0 11, маску подсети на 255 255 255 0 и шлюз по умолчанию на 192 168 0 1 для IPv4. Чтобы использовать Интернет, я выбираю "Получить IP-адрес автоматически" через панель управления.
Я хотел бы иметь скрипт, который позволит мне быстро выбрать один или другой параметр Ethernet - аппаратный или интернет.
Я программирую в основном на Python, но, возможно, есть решение для пакетного файла.
Спасибо,
Барри.
5 ответов
Для этого можно использовать модуль WMI Python (установите расширения PyWin32 и модуль WMI перед запуском этих сценариев). Вот как настроить вещи для общения с аппаратным устройством:
import wmi
# Obtain network adaptors configurations
nic_configs = wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=True)
# First network adaptor
nic = nic_configs[0]
# IP address, subnetmask and gateway values should be unicode objects
ip = u'192.168.0.11'
subnetmask = u'255.255.255.0'
gateway = u'192.168.0.1'
# Set IP address, subnetmask and default gateway
# Note: EnableStatic() and SetGateways() methods require *lists* of values to be passed
nic.EnableStatic(IPAddress=[ip],SubnetMask=[subnetmask])
nic.SetGateways(DefaultIPGateway=[gateway])
Вот как можно вернуться к получению IP-адреса автоматически (через DHCP):
import wmi
# Obtain network adaptors configurations
nic_configs = wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=True)
# First network adaptor
nic = nic_configs[0]
# Enable DHCP
nic.EnableDHCP()
Примечание: в производственном скрипте вы должны проверить значения, возвращаемые EnableStatic(), SetGateways() и EnableDHCP (). ("0" означает успех, "1" означает, что требуется перезагрузка, а другие значения описаны на страницах MSDN, связанных именами методов. Примечание: для EnableStatic() и SetGateways() коды ошибок возвращаются в виде списков).
Полная информация обо всех функциональных возможностях класса Win32NetworkAdapterConfiguration также может быть найдена в MSDN.
Примечание: я протестировал это с Python 2.7, но так как модули PyWIn32 и WMI доступны для Python 3, я полагаю, что вы сможете добиться того, чтобы это работало для Python 3, удалив "u" перед строковыми литералами.
Вы можете использовать модуль подпроцесса для запуска
netsh interface ip set address [params]
Запустите это из командной строки (без [params]), чтобы получить некоторую помощь, как его использовать. Тогда вы можете сделать
import subprocess
subprocess.call("netsh interface ip set address ....".split())
Вы можете использовать VBScript для изменения IP-адреса,
Dim strIPAddress, strSubnetMask,strGateway, intGatewayMetric, strDns1, strDns2, objWMIService, colItems, stradaptername, objFSO
Const ForReading = 1
Const ForAppending = 8
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set OutPutFile = objFSO.CreateTextFile("C:\ProgramData\test.txt" ,2 , True)
Set InterfaceName = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapter Where NetConnectionStatus >= 0")
If objFSO.FileExists("C:\ProgramData\test.txt") Then
Set OutPutFile = objFSO.CreateTextFile("C:\ProgramData\test1.txt" ,2 , True)
End If
For Each objItem in InterfaceName
If objFSO.FileExists("C:\ProgramData\test.txt") Then
arrInterfaces = objItem.NetConnectionID
'wscript.echo "test: " &arrInterfaces
Set objFileToWrite = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\ProgramData\test.txt",8,true)
ObjFileToWrite.WriteLine(arrInterfaces)
objFileToWrite.Close
Set objFileToWrite = Nothing
End If
next
If objFSO.FileExists("C:\ProgramData\test.txt") Then
Set objFileToRead = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\ProgramData\test.txt",1)
strFileText = objFileToRead.ReadAll()
objFileToRead.Close
Set objFileToRead = Nothing
'wscript.echo "obtained" &strFileText
End If
Result = inputbox("Enter the AdapterName: " &vbCrLf &strFileText)
If Result = "" then
'wscript.echo "user selected cancel"
Else
strIPAddress=InputBox("Enter Static IP Adrress: ")
strSubnetMask =InputBox("Enter SubnetMask: " )
strGateway=InputBox("Enter Default Gateway: ")
strDns1=InputBox("Enter Preferred DNS: ")
strDns2=InputBox("Enter Alternate DNS: ")
Set objShell = WScript.CreateObject("Wscript.Shell")
objShell.CurrentDirectory = "C:\Windows\System32"
objShell.Run "netsh interface ip set address name=""" & Result & """ static " & strIPAddress & " " & strSubnetMask & " " & strGateway & " " & intGatewayMetric, 0, True
objShell.Run "netsh interface ip set dns name=" & Result & " static "& strDns1, 0, True
objShell.Run "netsh interface ip add dns name=" & Result & " addr="& strDns2, 0, True
Set objShell = Nothing: Set obj=Nothing
End If
WScript.Quit
На самом деле это очень просто (только для Windows) (используются только предустановленные библиотеки):
import os; os.system("ipconfig /renew")
Ты можешь использовать
import os
import subprocess
def find_net_device():
cmd ='netsh interface ipv4 show interfaces'.split()
result = subprocess.run(cmd, universal_newlines=True, stdout=subprocess.PIPE)
result = result.stdout
result = result.split('connected')[2]
result = result.split('\n')[0]
result = result.strip()
return result
def change_ip(ip):
adapter = find_net_device()
change = f'netsh interface ip set address {adapter} static {ip} 255.255.255.0'
change = change.split()
change_ip('165.22.64.68')
И поменять его обратно
def back2normal():
adapter = find_net_device()
normal = f'netsh interface ip set address {adapter} dhcp'
subprocess.run(normal, stdout=subprocess.PIPE, universal_newlines=True)