Папка Python _winreg

В настоящее время я пытаюсь использовать python для поиска записей реестра с помощью _winreg. Это мой код:

from _winreg import *
import getpass

compName = raw_input("What is the name of the PC you wish to get a list of?: ")
currentUser = getpass.getuser()
filePath = "C:\\Users\\" + currentUser + "\\Desktop\\" + compName + "_Install_Programs.txt"

aReg = ConnectRegistry(compName,HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData")
file = open(filePath, "w")
for i in range(1024):
    try:
        asubkey_name=EnumKey(aKey,i)
        asubkey=OpenKey(aKey,asubkey_name)
        val=QueryValueEx(asubkey, "DisplayName")
        val_disp = val[0]
        val_str = val_disp.encode('ascii', 'ignore')
        if "KB" not in val_str:   
                file.write(val_str)
                file.write("\n")
    except EnvironmentError:
        pass
file.close()

Однако он не будет искать там какие-либо подпапки папок. Например, он содержит папку с именем S-1-5-18, а затем под ней находятся еще 3 папки с именами «Компоненты», «Заплатки» и «Продукты». Как заставить _winreg просмотреть все эти папки и следующие за ними папки, чтобы найти все ключи со значением имени «DisplayName»?

Посмотрел документацию, но ничего не увидел в списке. Возможно, объяснение не так ясно, как я думаю.

РЕДАКТИРОВАТЬ

Итак, я понял, что не углублялся в папки, поэтому с помощью этого кода я получаю правильный доступ к папкам:

for i in range(1024):
try:
    asubkey_name=EnumKey(aKey,i)
    asubkey=OpenKey(aKey,asubkey_name)
    for j in range(1024):
        asubkey_name2=EnumKey(asubkey,j)
        if asubkey_name2 == "Products":
            asubkey2 = OpenKey(asubkey, asubkey_name2)
            for k in range(1024):
                asubkey_name3=EnumKey(asubkey2, k)
                asubkey3=OpenKey(asubkey2, asubkey_name3)
                print asubkey3
                for l in range(1024):
                    asubkey_name4=EnumKey(asubkey3, l)
                    print asubkey_name4
                    asubkey4 = OpenKey(asubkey3, asubkey_name4)
except EnvironmentError:
    pass

и мой вывод показывает следующее:

<PyHKEY:0x000001E8>
Features
<PyHKEY:0x000001F0>
InstallProperties
<PyHKEY:0x000001F4>
Patches
<PyHKEY:0x000001EC>
Usage
<PyHKEY:0x000001D8>
<PyHKEY:0x000001E4>
Features
<PyHKEY:0x000001EC>
InstallProperties
<PyHKEY:0x000001F0>
Patches
<PyHKEY:0x000001E8>
Usage
<PyHKEY:0x000001D8>

Итак, я знаю, что он достиг этих папок. Но когда я добавляю код для поиска «DisplayName» следующим образом:

for i in range(1024):
try:
    asubkey_name=EnumKey(aKey,i)
    asubkey=OpenKey(aKey,asubkey_name)
    for j in range(1024):
        asubkey_name2=EnumKey(asubkey,j)
        if asubkey_name2 == "Products":
            asubkey2 = OpenKey(asubkey, asubkey_name2)
            for k in range(1024):
                asubkey_name3=EnumKey(asubkey2, k)
                asubkey3=OpenKey(asubkey2, asubkey_name3)
                print asubkey3
                for l in range(1024):
                    asubkey_name4=EnumKey(asubkey3, l)
                    print asubkey_name4
                    asubkey4 = OpenKey(asubkey3, asubkey_name4)
                    val=QueryValueEx(asubkey4, "DisplayName")
                    print val
                    val_disp = val[0]
                    val_str = val_disp.encode('ascii', 'ignore')
                    file.write(val_str)
                    file.write("\n")
except EnvironmentError:
    pass

Это мой вывод:

<PyHKEY:0x000001E8>
Features
<PyHKEY:0x000001E4>
Features

Как будто он потерял папки или не получает к ним доступ таким же образом. Вероятно, это простое решение, но, глядя на него, я просто не понимаю, что здесь не так.


person Community    schedule 29.01.2015    source источник
comment
Ответ должен быть Шифрование. Они, скорее всего, зашифрованы.   -  person sarveshseri    schedule 29.01.2015
comment
Это не так, потому что я могу указать на папку и получить информацию, но она будет искать только один уровень подпапки, а не подпапки подпапок, если это имеет смысл?   -  person    schedule 29.01.2015
comment
Это потому, что вы всегда получаете доступ только на один уровень ниже одной и той же клавиши. попробуйте сделать это рекурсивно.   -  person sarveshseri    schedule 29.01.2015
comment
Спасибо за предложение. Смотрите мой ответ ниже, основанный на вашем совете! :)   -  person    schedule 29.01.2015


Ответы (1)


После долгих исследований я нашел решение. Это может быть не самое красивое, но оно работает. Я открыт для предложений о том, как его улучшить, но вот мой код для тех, кто сталкивается с той же проблемой, что и я:

from _winreg import *

compName = raw_input("What is the name of the PC you wish to get a list of?: ")

aReg = ConnectRegistry(compName,HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData")

for i in range(1024):
    try:
        asubkey_name=EnumKey(aKey,i)
        asubkey=OpenKey(aKey,asubkey_name)
        for j in range(1024):
            asubkey_name2=EnumKey(asubkey,j)
            if asubkey_name2=="Products":
                asubkey2 = OpenKey(asubkey, asubkey_name2)
                for k in range(1024):
                    asubkey_name3=EnumKey(asubkey2, k)
                    asubkey3 = OpenKey(asubkey2, asubkey_name3)
                    for l in range(4):
                        asubkey_name4=EnumKey(asubkey3,l)
                        if asubkey_name4=="InstallProperties":
                            asubkey4=OpenKey(asubkey3, asubkey_name4)
                            try:
                                dn=QueryValueEx(asubkey4, "DisplayName")
                                dn_Val = dn[0]
                                dn_Str = dn_Val.encode('ascii', 'ignore')
                                vn=QueryValueEx(asubkey4, "DisplayVersion")
                                vn_Val = vn[0]
                                vn_Str = vn_Val.encode('ascii', 'ignore')
                                pn=QueryValueEx(asubkey4, "Publisher")
                                pn_Val = pn[0]
                                pn_Str = pn_Val.encode('ascii', 'ignore')
                                print "Name: " + dn_Str
                                print "Version: " + vn_Str
                                print "Publisher: " + pn_Str + "\n"
                            except EnvironmentError:
                                pass

    except EnvironmentError:
        pass

Это позволяет мне детализировать и получить необходимую информацию. Теперь я знаю, что использование операторов try и exclude может быть лучше использовано, но на данный момент это результат, который он мне дает (и то, что я хотел!)

    What is the name of the PC you wish to get a list of?:

    Name: Microsoft Office 2007 Primary Interop Assemblies
    Version: 12.0.4518.1014
    Publisher: Microsoft Corporation

    Name: Microsoft Office Professional Plus 2007
    Version: 12.0.6612.1000
    Publisher: Microsoft Corporation

    Name: Microsoft Office InfoPath MUI (English) 2007
    Version: 12.0.6612.1000
    Publisher: Microsoft Corporation

    ...............

надеюсь, это поможет

person Community    schedule 29.01.2015