0

現在、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 というフォルダーがあり、その下には Components、Patches、Products という 3 つのフォルダーがあります。_winreg がこれらすべてのフォルダーとそれに続くフォルダーを調べて、"DisplayName" という名前の値を持つすべてのキーを見つけるにはどうすればよいですか?

ドキュメントを見ましたが、何もリストされていませんでした。説明が思ったほど明確でないかもしれません

編集

OK、フォルダーにドリルダウンしていないことに気付いたので、このコードでフォルダーへの適切なアクセスを取得しています。

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

フォルダが失われたか、同じ方法でアクセスしていないようです。それはおそらく単純な解決策ですが、それを見ると、ここで何が問題なのかわかりません

4

1 に答える 1

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

これにより、ドリルダウンして必要な情報を取得できます。これで、try ステートメントと except ステートメントを使用したほうがうまく利用できることがわかりましたが、今のところ、これが出力結果です (そして、私が求めていたものです!)

    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

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

これが役立つことを願っています

于 2015-01-29T16:27:14.177 に答える