Seite 1 von 1

_winreg Windows-Registry rekursiv durchgehen

Verfasst: Dienstag 25. April 2006, 10:23
von droptix
Ich möchte die komplette Windows-Registry rekursiv durchwandern, um z.B. darin zu suchen. Ich suche quasi sowas wie _winreg.walk() :twisted:

Mir dämmert, dass ich da mit dem _winreg Modul wohl nicht sehr weit kommen werde. Auf die Win32 Erweiterungen wollte ich eigentlich verzichten, wenn es möglich ist... wenn nicht, dann muss ich sie halt einbeziehen, aber ist wieder Neuland.

Es geht schon los beim Verbinden zur Registry, denn da muss ich einen Schlüssel angeben. Wenn ich aber alle durchwandern will, ist Handarbeit gefragt:

Code: Alles auswählen

HKEYs = [
    _winreg.HKEY_CLASSES_ROOT,
    _winreg.HKEY_CURRENT_USER,
    _winreg.HKEY_LOCAL_MACHINE,
    _winreg.HKEY_USERS,
    _winreg.HKEY_CURRENT_CONFIG
]
for HKEY in HKEYs:
    regHandler = _winreg.ConnectRegistry(None, HKEY)
Zum einen finde ich es doof, wenn ich statisch alle Keys angebe. Was ist wenn später mit Windows Vista weitere dazu kommen?

Und zum anderen weiß ich nicht, wie ich an die Namen der Subkeys komme, um sie dann zu durchwandern. Nur die Anzahl bekommt man über QueryInfoKey() raus. Values sind ja mittels QueryValue() machbar... aber die Namen der Subkeys nicht.

Jemand einen Ansatz?

Erweiterung

Verfasst: Dienstag 25. April 2006, 11:19
von droptix
Das gänge auch noch, um die HKEYs heraus zu bekommen. Bringt aber mehr HKEY-Konstanten als es wirklich gibt. Ein ConnectRegistry() mittels try() ist damit unerlässlich:

Code: Alles auswählen

import _winreg
# get all possible HKEYs
HKEYs = []
for method in dir(_winreg):
    if method.startswith("HKEY_"):
        HKEYs.append(method)
Aber solche bedingte For-Schleifen lassen sich doch auch als Einzeiler schreiben, richtig? Wie ging das nochmal?

P.S. Die Namen der Subkeys hab ich immer noch nicht... :?

Verfasst: Dienstag 25. April 2006, 11:25
von modelnine
For-Schleife als Einzeiler nennt sich dann List-Comprehension:

Code: Alles auswählen

HKEYs = [m for m in dir(_winreg) if m.startswith("HKEY_")]

_winreg.EnumKey()

Verfasst: Dienstag 25. April 2006, 11:28
von droptix
@modelnine: Vielen Dank!

Aaah, _winreg.EnumKey() macht's möglich :) Gelöst!