Скрипт для изменения 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)
Другие вопросы по тегам