茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

PythonによるWindowsレジストリのデータ取得方法

はじめに

レジストリデータ取得

■ registory.py

import winreg

class Registory:
    HKEY = {
        'HKEY_CLASSES_ROOT': winreg.HKEY_CLASSES_ROOT,
        'HKEY_CURRENT_USER': winreg.HKEY_CURRENT_USER,
        'HKEY_LOCAL_MACHINE': winreg.HKEY_LOCAL_MACHINE,
        'HKEY_USERS': winreg.HKEY_USERS,
        'HKEY_CURRENT_CONFIG': winreg.HKEY_CURRENT_CONFIG
        }

    def __init__(self, default_hkey='HKEY_CURRENT_USER', debug=False):
        # https://docs.python.org/ja/3/library/winreg.html
        self.key = None
        self.sub_key = ''
        self.handle = None
        self.default_hkey = Registory.HKEY[default_hkey]
        self.debug = debug

    def _debug(self, msg):
        if self.debug:
            print(f"{msg}")

    def _status(self):
        if self.debug:
            print(f"\n[!] ********** STATUS **********\n[-] Key: {self.key} \n[-] Sub_Key: {self.sub_key} \n[-] Handle: {self.handle} \n[-] Default: {self.default_hkey}\n")

    def _hkey(self, hkey=None):
        self._debug("\n[!] ********** _HKEY **********\n")
        self._status()

        if hkey is None:
            if self.key is None:
                return self.default_hkey
            else:
                return self.key
        elif isinstance(hkey, str):
            return Registory.HKEY.get(hkey, self.default_hkey)
        else:
            return hkey


    def open(self, key=None, sub_key=None):
        self._debug(f"\n[!] ********** OPEN **********\n[-] Key: {self.key} \n[-] Sub_Key: {self.sub_key} \n[-] Handle: {self.handle}\n")

        self.key = self._hkey(key)
        if sub_key is not None:
            self.sub_key = sub_key
        self.handle = winreg.OpenKeyEx(self.key, self.sub_key)

        self._status()

        return self.handle

    def info(self, key=None):
        self._debug(f"\n[!] ********** INFO **********\n[-] Key: {self.key} \n[-] Sub_Key: {self.sub_key} \n[-] Handle: {self.handle}\n")

        self.key = self._hkey(key)

        self._status()

        return winreg.QueryInfoKey(self.key)

    def get_keys(self, key=None, index=0):
        self._debug(f"\n[!] ********** GET_KEYS **********\n[-] Key: {self.key} \n[-] Sub_Key: {self.sub_key} \n[-] Handle: {self.handle}\n")

        self.key = self._hkey(key)
        key_info = self.info(self.key)

        self._debug(f"SubKeys: {key_info[0]} , values: {key_info[1]} , Date: {key_info[2]}")

        sub_keys = [winreg.EnumKey(self.key, idx) for idx in range(0, key_info[0])]

        self._status()

        return sub_keys

    def get(self, value_name):
        self._debug(f"\n[!] ********** GET **********\n Handle: {self.handle} , Value_Name: {value_name}")

        return winreg.QueryValueEx(self.handle, value_name)

    def close(self):
        return self.handle.Close()

■ main.py

import sys
sys.path.append('.')

from Registory import Registory

ie = Registory(debug=True)
print(ie.get_keys())
print(ie.info())
print(ie.get_keys('HKEY_LOCAL_MACHINE'))
print(ie.info('HKEY_CURRENT_CONFIG'))
h = ie.open(sub_key='Software')
print(ie.get_keys(h))
print(ie.info(h))
print(ie.get_keys())
print(ie.info())
ie.close()

ie2 = Registory(debug=True)
ie2.open('HKEY_LOCAL_MACHINE', 'SOFTWARE\\Microsoft\\Internet Explorer\\Main')
reg2_data = ie2.get('Start Page')
print(reg2_data)
reg2_data = ie2.get_keys('HKEY_LOCAL_MACHINE', 2)
print(reg2_data)
ie2.close()

参考リンク