Scanning through Windows registry...
Mike Driscoll
kyosohma at gmail.com
Wed May 7 08:57:43 EDT 2008
On May 7, 4:45 am, Tim Golden <m... at timgolden.me.uk> wrote:
> In a spirit of being helpful... :)
>
> The code below (which I imagine every Windows programmer writes
> sometime in their Python life) mimics the os.walk functionality, yielding
> the key, subkeys, and values under a particular starting point in the
> registry. The "if __name__ == '__main__'" test run at the bottom does
> more-or-less what you were asking for originally, I think, converting
> some name to some other name wherever it appears.
>
> <module regwalk.py>
> import _winreg
>
> HIVES = {
> "HKEY_LOCAL_MACHINE" : _winreg.HKEY_LOCAL_MACHINE,
> "HKEY_CURRENT_USER" : _winreg.HKEY_CURRENT_USER,
> "HKEY_CLASSES_ROOT" : _winreg.HKEY_CLASSES_ROOT,
> "HKEY_USERS" : _winreg.HKEY_USERS,
> "HKEY_CURRENT_CONFIG" : _winreg.HKEY_CURRENT_CONFIG
>
> }
>
> class RegKey:
>
> def __init__ (self, name, key):
> self.name = name
> self.key = key
>
> def __str__ (self):
> return self.name
>
> def walk (top):
> """walk the registry starting from the key represented by
> top in the form HIVE\\key\\subkey\\..\\subkey and generating
> key, subkey_names, values at each level.
>
> key is a lightly wrapped registry key, including the name
> and the HKEY object.
> subkey_names are simply names of the subkeys of that key
> values are 3-tuples containing (name, data, data-type).
> See the documentation for _winreg.EnumValue for more details.
> """
> if "\\" not in top: top += "\\"
> root, subkey = top.split ("\\", 1)
> key = _winreg.OpenKey (HIVES[root], subkey, 0, _winreg.KEY_READ | _winreg.KEY_SET_VALUE)
>
> subkeys = []
> i = 0
> while True:
> try:
> subkeys.append (_winreg.EnumKey (key, i))
> i += 1
> except EnvironmentError:
> break
>
> values = []
> i = 0
> while True:
> try:
> values.append (_winreg.EnumValue (key, i))
> i += 1
> except EnvironmentError:
> break
>
> yield RegKey (top, key), subkeys, values
>
> for subkey in subkeys:
> for result in walk (top + "\\" + subkey):
> yield result
>
> if __name__ == '__main__':
> for key, subkey_names, values in walk ("HKEY_LOCAL_MACHINE\\Software\\Python"):
> print key
> for (name, data, type) in values:
> print " ", name, "=>", data
> if type == _winreg.REG_SZ and "TJG" in data:
> _winreg.SetValueEx (key.key, name, 0, type, data.replace ("TJG", "XYZ"))
>
> </module regwalk.py>
>
> TJG
This is pretty cool stuff, Tim. Of course, it would also seriously
screw up some programs if you decided to replace the wrong phrase.
Just a word of warning to the OP: be sure to make a backup of the
registry before doing something like this. Trying to fix a messed up
registry from the command line is not a fun way to spend the
afternoon.
Mike
More information about the Python-list
mailing list