Модификация DWORD реестра Windows

#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, что было бы правильно.

Скриншот сервера CIPC TFTP

 #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