2015-01-29 4 views
0

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

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»?

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

EDIT

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

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 

Это как он потерял папки или не обращается к ним то же самое путь. Это, вероятно, простое решение, но, глядя на него, я просто не могу понять, что здесь не так.

+0

Ответ должен быть Шифрование. Скорее всего, они зашифрованы. –

+0

Их нет, потому что я могу указать на папку и получить информацию, но она будет искать только один уровень подпапки, а не подпапки подпапок, если это имеет смысл? –

+0

Это потому, что вы всегда получаете доступ к одному уровню ниже того же ключа. попробуйте сделать это рекурсивно. –

ответ

0

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

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 

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

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 

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

Я надеюсь, что это помогает