#python-3.x #windows #registry
#python-3.x #Windows #реестр
Вопрос:
Ищу некоторую помощь в сценарии, над которым я работаю.
Целью скрипта является автоматическое изменение подраздела REG_DWORD для «tftp server1», это для приложения Cisco IP communicator.
REG_DWORD принимает IP-адрес в шестнадцатеричном или десятичном виде. Небольшая проблема заключается в том, что значение для IP-адреса должно быть изменено на обратное. ПРИМЕР) 10.11.12.13, необходимо изменить на 13.12.11.10, а затем преобразовать в шестнадцатеричное или десятичное и обновить в REG_DWORD.
Проблема, которую я вижу, используя пример IP-адреса 10.11.12.13 — после преобразования в двоичный и обратного преобразования значение десятичной дроби обратно в IP-адрес отображается как 31.21.11.1, А НЕ как 31.21.11.10, как хотелось бы.
Тестирование с отдельной переменной в виде строки: переменная testip. Пример IP-адреса 11.12.13.14 — после преобразования в двоичный и обратного преобразования десятичное значение обратно в IP-адрес отображается как 41.31.21.11, что является желательным.
Я не уверен, почему удаляется конечный ноль. Это проблема, потому что, если бы она была введена в реестр
Как показано на скриншоте, если десятичное значение переменной ippoint настроено в реестре, IP-адрес, установленный для CIPC (Cisco IP Communicator), равен 1.12.13.14, А НЕ 10.12.13.14, если бы я ВРУЧНУЮ настроил значение переменной iptoint2, это было бы 11.12.13.14, что было бы правильно.
#Modules imported
import configparser
import winreg
import ipaddress
def regkey():
config = configparser.ConfigParser() # Variable for configparser as config
config.read(r'<ACTUAL DIRECTORY REDRACTED>IP_VARS.ini') #REMOVED DIRECTORY FOR THIS POST # Variable to read .INI file
tftp1 = config['IP_VAR_1']['tftp_server1'] # Variable to pull 'tftp_server' IP from .INI
testip = "11.12.13.14" # Variable for second test IP as a string
iptoint = int(ipaddress.IPv4Address(tftp1[::-1])) # Variable to take tftp1 as string turn into decimal(integer)
iptoint2 = int(ipaddress.IPv4Address(testip[::-1])) # Variable to take testip as string, turn into decimal(integer)
tshoot = ipaddress.IPv4Address(iptoint)
tshoot2 = ipaddress.IPv4Address(iptoint2)
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as hkey: # Connect to registry as hkey
with winreg.OpenKey(hkey, r"SOFTWAREWOW6432NodeCisco Systems, Inc.Communicator", 0, winreg.KEY_ALL_ACCESS) as sub_key: # Open hkey for CIPC as sub_key
current_key_value,current_key_type = winreg.QueryValueEx(sub_key, "TftpServer1") # Show current sub_key value
print("This is the Current Decimal Value of the Tftpserver1 DWORD:" "t" f"{current_key_value}")
print("This is the Type of the DWORD:" "t" f"{current_key_type}")
print()
print("The below value is the selected TFTP server IP, converted to decimal and reversed.")
print()
print(iptoint)
print("This is testip variable converted to decimal and reversed")
print()
print(iptoint2)
print()
print(tshoot)
print(tshoot2)
Результат
This is the Current Decimal Value of the Tftpserver1 DWORD: 689902859
This is the Type of the DWORD: 4
The below value is the selected TFTP server IP, converted to decimal and reversed.
521472769
This is testip variable converted to decimal and reversed
689902859
31.21.11.1
41.31.21.11
Process finished with exit code 0
В качестве отказа от ответственности я ОЧЕНЬ новичок в программировании. Не стесняйтесь говорить со мной, как будто мне 5 лет. Любая помощь будет оценена. Это моя первая публикация для справки по сценариям, поэтому, пожалуйста, дайте мне знать, если мне нужно объяснить что-нибудь еще относительно моего кода / проблемы.
Ответ №1:
В конечном итоге проблема устраняется следующим образом:
import configparser
def reverse(ip):
if len(ip) <= 1:
return ip
return '.'.join(ip.split('.')[::-1])
config = configparser.ConfigParser() # Variable for configparser as config
config.read(r'C:UsersGerniDesktopJarvisGerni ScriptIP_VARS.ini') # Variable to read .INI file
tftp1 = config['IP_VAR_1']['tftp_server1'] # Variable to pull 'tftp_server' IP from .INI
print(reverse(tftp1))
Результат:
13.12.11.10