Как использовать Python для получения значений реестра?

Я написал этот код до сих пор;

from _winreg import * def val2addr(val): addr = '' for ch in val: addr += '%02x '% ord(ch) addr = addr.strip(' ').replace(' ', ':')[0:17] return addr def printNets(): net = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"+\ "\NetworkList\Signatures\Unmanaged" key = OpenKey(HKEY_LOCAL_MACHINE, net) print '\n[*] Networks You Have Joined.' for i in range(100): try: guid = EnumKey(key, i) netKey = OpenKey(key, str(guid)) (n, addr, t) = EnumValue(netKey, 5) (n, name, t) = EnumValue(netKey, 4) macAddr = val2addr(addr) netName = str(name) print '[+] ' + netName + ' ' + macAddr CloseKey(netKey) except: break def main(): printNets() if __name__ == "_main_": main() 

Этот скрипт возвращает MAC-адреса и сетевые имена всех подключенных Wi-Fi-сетей.

Он возвращает значения из

Компьютер \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows> NT \ CurrentVersion \ NetworkList \ Подписи \ Неуправляемые \

Я на Windows 8.1, и я проверил через Regedit.exe, чтобы убедиться, что это правильное местоположение для информации, которую я получаю.

Когда я запускаю этот код, он говорит «WindowsError: [Ошибка 2] Система не может найти указанный файл"

Так что же я делаю неправильно?

PS Я на Python 2.7.9

Полный проспект

Traceback (последний последний вызов):

 File "<pyshell#11>", line 1, in <module> printNets() File "C:/Users/Nathaniel/Desktop/MacAddr Meta-Reader.py", line 13, in printNets key = OpenKey(HKEY_LOCAL_MACHINE, net) WindowsError: [Error 2] The system cannot find the file specified 

2 Solutions collect form web for “Как использовать Python для получения значений реестра?”

Вероятно, вы используете 32-битный Python в 64-битной Windows. В этом случае открытие HKLM\SOFTWARE перенаправляется на HKLM\SOFTWARE\Wow6432Node . Вы должны указать иначе, если вы хотите использовать 64-битный ключ. Например:

 key = OpenKey(HKEY_LOCAL_MACHINE, net, 0, KEY_READ | KEY_WOW64_64KEY) 

Обратите внимание, что для подключений, открытых по отношению к этому key объекту, не обязательно указывать KEY_WOW64_64KEY .


Я портировал ваш код для запуска как на Python 2, так и на 3, добавил итераторы и исключил жестко заданные range и значения индекса. Возможно, вы найдете это полезным:

 from __future__ import print_function import itertools try: from winreg import * except ImportError: # Python 2 from _winreg import * KEY_READ_64 = KEY_READ | KEY_WOW64_64KEY ERROR_NO_MORE_ITEMS = 259 def iterkeys(key): for i in itertools.count(): try: yield EnumKey(key, i) except OSError as e: if e.winerror == ERROR_NO_MORE_ITEMS: break raise def itervalues(key): for i in itertools.count(): try: yield EnumValue(key, i) except OSError as e: if e.winerror == ERROR_NO_MORE_ITEMS: break raise def val2addr(val): return ':'.join('%02x' % b for b in bytearray(val)) NET_UNMANAGED = (r"SOFTWARE\Microsoft\Windows NT\CurrentVersion" r"\NetworkList\Signatures\Unmanaged") def printNets(keystr=NET_UNMANAGED): key = OpenKey(HKEY_LOCAL_MACHINE, keystr, 0, KEY_READ_64) print('\n[*] Networks You Have Joined.') for guid in iterkeys(key): netKey = OpenKey(key, guid) netName, macAddr = '', '' for name, data, rtype in itervalues(netKey): if name == 'FirstNetwork': netName = data elif name == 'DefaultGatewayMac': macAddr = val2addr(data) if netName: print('[+]', netName, macAddr) CloseKey(netKey) CloseKey(key) 

Дескриптор безопасности ключа допускает доступ только к администраторам и службе netprofm, как показано ниже. Таким образом, вам нужно либо запустить сценарий из командной строки с повышенными полномочиями, либо использовать технику для автоматического запуска скрипта.

 C:\>set NT=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion C:\>accesschk -qldk "%NT%\NetworkList\Signatures\Unmanaged" HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ NetworkList\Signatures\Unmanaged DESCRIPTOR FLAGS: [SE_DACL_PRESENT] [SE_DACL_PROTECTED] OWNER: BUILTIN\Administrators [0] ACCESS_ALLOWED_ACE_TYPE: NT SERVICE\netprofm [CONTAINER_INHERIT_ACE] [INHERITED_ACE] KEY_QUERY_VALUE KEY_CREATE_LINK KEY_CREATE_SUB_KEY KEY_ENUMERATE_SUB_KEYS KEY_NOTIFY KEY_SET_VALUE READ_CONTROL DELETE [1] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Administrators [CONTAINER_INHERIT_ACE] [INHERITED_ACE] KEY_ALL_ACCESS C:\>sc qdescription netprofm [SC] QueryServiceConfig2 SUCCESS SERVICE_NAME: netprofm DESCRIPTION: Identifies the networks to which the computer has connected, collects and stores properties for these networks, and notifies applications when these properties change. 

У вас есть права администратора? Я попытался спуститься по дереву с помощью «reg query», чтобы убедиться, что у меня нет проблемы с орфографией, и когда я добрался до «NetworkList», я получил ошибку Access denied. Я изменил права администратора, и все было в порядке.

 reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList ERROR: Access is denied. 
  • Где можно скачать бинарные яйца с psycopg2 для Windows?
  • Создание скрипта Python в широком масштабе
  • Установка virtualenvwrapper в Windows
  • Как прервать подпроцессы Python в Windows при использовании API Python C?
  • Связи python libclang на Windows не позволяют инициализировать блок перевода из возвышенного текста
  • Python работает под управлением Windows: OSError: Недопустимый дескриптор
  • перенаправить вывод в текстовый файл с помощью оболочки Windows '>' в python
  • как использовать «/» (разделитель каталогов) в Linux и Windows?
  • Python - лучший язык программирования в мире.