Registry Problem

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
amphi
User
Beiträge: 6
Registriert: Montag 29. September 2014, 08:53

Hallo Zusammen,

mein erster Post gleich mit einem Problemchen :/

Ich schreibe derzeit ein Tool für unser firmeninternes Konfigurationsmanagement. Ein Teil davon besteht daraus, die Registry anhand von absoluten Pfadangaben auszulesen.

Dazu der Code:

Code: Alles auswählen

def parseRegistry(filePath):
    registryEntries = {}
    location = HKEY_LOCAL_MACHINE
    
    aReg = ConnectRegistry(None, location)
    
    aKey = OpenKey(aReg, filePath)
    for i in range(QueryInfoKey(aKey)[1]):
        try:
            name,value,rtype, = EnumValue(aKey, i)
            registryEntries[name] = (value,rtype)
        except EnvironmentError:
            break
    CloseKey(aKey)
    CloseKey(aReg)
    
    return registryEntries
Dieser Code ist getestet und funktioniert mit beispielsweise folgendem Szenario:

Code: Alles auswählen

print(dataCollector.parseRegistry(r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'))

Ausgabe:
{'SunJavaUpdateSched': ('"C:\\Program Files (x86)\\Common Files\\Java\\Java Update\\jusched.exe"', 1), 'IMSS': ('"C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IMSS\\PIconStartup.exe" "C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IMSS\\PrivacyIconClient.exe" 60', 1), 'Adobe ARM': ('"C:\\Program Files (x86)\\Common Files\\Adobe\\ARM\\1.0\\AdobeARM.exe"', 1)}
Gehe ich nun jedoch zu den Registryeinträgen unserer Eigenentwicklungen über, passiert folgendes:

Code: Alles auswählen

print(dataCollector.parseRegistry(r'SOFTWARE\SmartCast\SmartMediaNet\Backup'))

Ausgabe:
Traceback (most recent call last):
  File "C:\Users\doebereiner\workspace\SmartConfig\Agents\test.py", line 13, in <module>
    print(dataCollector.parseRegistry(r'SOFTWARE\SmartCast\SmartMediaNet\Backup'))
  File "C:\Users\doebereiner\workspace\SmartConfig\Agents\dataCollector.py", line 126, in parseRegistry
    aKey = OpenKey(aReg, filePath)
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden
Diese Fehlermeldung ergibt für mich 0 Sinn, da ich bereits zig Mal eben diesen Pfad überprüft habe. Wenn ich den Schlüssel aus dem regedit kopiere, kommt genau eben diese Pfadangabe:
HKEY_LOCAL_MACHINE\SOFTWARE\SmartCast\SmartMediaNet\Backup

Falls jemand nur die kleinste Idee hat, die mich weiter bringen könnte, wäre ich unglaublich dankbar!

Grüße,

amphi
Software is a possible solution to a stated problem. Anything more is just dreaming of unicorns and fairy dust. - Greg Strange
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ich befürchte du bist da reingelaufen. Achja, kann sein, dass du noch Admin Rechte brauchst.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
amphi
User
Beiträge: 6
Registriert: Montag 29. September 2014, 08:53

Danke für den Hinweis, werde ich dann gleich nach der Mittagspause ausprobieren :)

Ich hab jetzt noch folgendes getestet:

Ich habe die Funktion so abgeändert, dass sie mir nur die Folder anzeigt und ich somit überprüfen kann, ob mein Custom Folder überhaupt auftaucht.

Code: Alles auswählen

Funktion (nur geänderter Teil):

for i in range(QueryInfoKey(aKey)[0]):
        try:
#             name,value,rtype, = EnumValue(aKey, i)
            folder = EnumKey(aKey, i)
            print(folder)
#             registryEntries[name] = (value,rtype)
        except WindowsError:
            break

Aufruf auf den kompletten SOFTWARE Baum:

print(dataCollector.parseRegistry(r'SOFTWARE'))

Ausgabe (gekürzt):

[...]
PDFCreator
Python
Realtek
Realtek Semiconductor Corp.
TeamViewer
TortoiseGit
TortoiseOverlays
VideoLAN
Western Digital
Wow6432Node
Classes
Clients
Policies
RegisteredApplications

Bei dieser Ausgabe stellt man fest, dass mein gesuchter Ordner (SmartCast\...) gar nicht erst aufgelistet ist! :K

Wie dieser Screen zeigt, existiert er aber! :/

Bild

Noch ein Hinweis, der den einen oder anderen vielleicht auf eine Spur führen könnte: Der Registryeintrag wurde mit einer *.reg Datei importiert

Grüße

amphi
Software is a possible solution to a stated problem. Anything more is just dreaming of unicorns and fairy dust. - Greg Strange
amphi
User
Beiträge: 6
Registriert: Montag 29. September 2014, 08:53

FIXED!

Hab deinen Tip (stackoverflow) befolgt und hab

Code: Alles auswählen

aKey = OpenKey(aReg, filePath)
durch

Code: Alles auswählen

aKey = OpenKey(aReg, filePath, 0, (KEY_WOW64_64KEY + KEY_ALL_ACCESS))
ersetzt.

Jetzt läuft alles wie geschmiert und ich kann mich endlich an das Bilden der exe-Datei machen, juhu!

Tausend Dank darktrym!
Software is a possible solution to a stated problem. Anything more is just dreaming of unicorns and fairy dust. - Greg Strange
amphi
User
Beiträge: 6
Registriert: Montag 29. September 2014, 08:53

Hi,

jetzt muss ich den Thread hier nochmal ausgraben! Ein halbes Jahr mit der für mich neuen Sprache Python ist vergangen und ich bin immer noch begeistert! :)

Jedoch habe ich mal wieder ein Problem - Herr Google hat leider keinen Rat für mich. Daher wende ich mich an euch.

Das System ist seit längerem im Einsatz, jedoch wird nun etwas mehr Flexibilität bei der Datengewinnung gewünscht.

Der aktuelle Code:

Code: Alles auswählen

def parseRegistry(filePath):
    registryEntries = {}
            
    try:
        location = _winreg.HKEY_LOCAL_MACHINE
        aReg = _winreg.ConnectRegistry(None, location)
        aKey = _winreg.OpenKey(aReg, filePath, 0, (_winreg.KEY_WOW64_64KEY + _winreg.KEY_ALL_ACCESS))
        for i in range(_winreg.QueryInfoKey(aKey)[1]):
        
            name,value,rtype, = _winreg.EnumValue(aKey, i)
            registryEntries[name] = (value,rtype)
            
        _winreg.CloseKey(aKey)
        _winreg.CloseKey(aReg)
    
        return registryEntries
    except WindowsError:
        pass
Der Parameter filePath ist ein kompletter, absoluter Registry-Pfad - dadurch ist das ganze etwas steif.
Ich möchte stattdessen nur ein Schlagwort angeben und daraufhin die Registry nach diesem durchsuchen und dann alle darunter liegenden Ordner inkl. Keys und Values auslesen.

Die Einträge liegen immer in 'SOFTWARE', daher kann ich zumindest hier eine erste Einschränkung vornehmen.

Erster Versuch:

Code: Alles auswählen

def parseRegistry(software_name):
    registryEntries = {}
            
    try:
        aKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE', 0, (_winreg.KEY_WOW64_64KEY + _winreg.KEY_ALL_ACCESS))
        
        #search whole registry for desired folder
        for i in range(_winreg.QueryInfoKey(aKey)[0]):
            folder = EnumKey(aKey,i)            
            if folder.lower() == software_name.lower():
                _winreg.CloseKey(aKey)
                print(folder)
                #open registry with new, correct folder
                aKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\\' + folder, 0, (_winreg.KEY_WOW64_64KEY + _winreg.KEY_ALL_ACCESS))
                for x in range(_winreg.QueryInfoKey(aKey)[1]):
                    try:                        
                        asubkey_name=EnumKey(aKey,x)
                        asubkey=_winreg.OpenKey(aKey,asubkey_name)
                        try:
                            val=_winreg.QueryValueEx(asubkey, "DisplayName")                            
                            print(val)
                        except EnvironmentError:
                            pass
                    except EnvironmentError:
                        break
#                 for x in range(_winreg.QueryInfoKey(aKey)[1]):
#                     name,value,rtype, = _winreg.EnumValue(aKey, x)
#                     registryEntries[name] = (value,rtype)          
                _winreg.CloseKey(aKey)
        return registryEntries
    except WindowsError:
        pass
Mein Ansatz war dabei, zuerst durch alle Ordner in 'SOFTWARE' zu iterieren, bis der gewünschte Ordner gefunden ist. Im nächsten Schritt war die Idee, die Registry nun mit dem gewünschten Ordner erneut zu öffnen um dort die Schlüssel auszulesen.
Das Matching der Folder funktioniert, jedoch bekomme ich für keys und values 'none' zurück.

Habe ich einen Denkfehler? Habt ihr Erfahrungen gemacht, wie man in solchen Fällen vorgeht (also auch Subfolder mit einbezieht)? Kann mir irgendwer einen Lösungsansatz nennen?

Ich erwarte keine fertige Funktion, sondern Denkanstöße! Wäre großartig, wenn mir da jemand unter die Arme greifen könnte!

Grüße,

amphi
Software is a possible solution to a stated problem. Anything more is just dreaming of unicorns and fairy dust. - Greg Strange
Antworten