_winreg Windows-Registry rekursiv durchgehen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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?
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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... :?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

For-Schleife als Einzeiler nennt sich dann List-Comprehension:

Code: Alles auswählen

HKEYs = [m for m in dir(_winreg) if m.startswith("HKEY_")]
--- Heiko.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

@modelnine: Vielen Dank!

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