2

各キーの内容を調べHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallて返すためのPythonスクリプトを作成する必要があります。DisplayName

私はこれを出発点として使用しています(別のスタックオーバーフローポストにあります)

import _winreg
import wmi

c = wmi.WMI(namespace="default").StdRegProv

result, value = c.GetStringValue (
    hDefKey=_winreg.HKEY_LOCAL_MACHINE,
    sSubKeyName="SYSTEM\ControlSet001\Services\MRxDAV",
    sValueName="ImagePath"
)
print value

それはうまくいきます。それは戻ります:

\SystemRoot\system32\drivers\mrxdav.sys

ただし、andを(有効な値に)変更するsSubKeyNamesValueName、非常に不安定に見え、None頻繁に返されます。

例えば:

c = wmi.WMI(namespace="default").StdRegProv

result, value = c.GetStringValue (
    hDefKey=_winreg.HKEY_LOCAL_MACHINE,
    sSubKeyName="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E5D76AD-A3FB-48D5-8400-8903B10317D3}",
    sValueName="DisplayName"
)
print value

これにより、None印刷されます。

でも、

result, value = c.GetStringValue (
    hDefKey=_winreg.HKEY_LOCAL_MACHINE,
    sSubKeyName="SOFTWARE\Microsoft\Windows\CurrentVersion\Installer",
    sValueName="InstallerLocation"
)
print value

正しい値を返します。

C:\Windows\SysWOW64\

次に試してみると:

result, value = c.GetStringValue (
    hDefKey=_winreg.HKEY_LOCAL_MACHINE,
    sSubKeyName="SOFTWARE\Microsoft\Windows\CurrentVersion\OptimalLayout",
    sValueName="LayoutFilePath"
)
print value

戻り値None

私は生の文字列を試し、スラッシュをエスケープしましたが、どちらも機能しませんでした。私もこのGetExpandedString()方法を試しましたが、同じように動作します。

値が長くなると失敗するように見えsSubKeyNameますが、これは単なる直感です。

編集

Y__によって投稿されたコードの少しクリーンなバージョン

key = _winreg.OpenKey(
    _winreg.HKEY_LOCAL_MACHINE,
    "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-001F-040C-1000-0000000FF1CE}",
    0, _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY)

name = _winreg.QueryValueEx(key, "DisplayName")
print name[0]
4

1 に答える 1

4

私はあなたのコードを調べましたが、失敗した場合のリターンコードは次の2ことを意味しますERROR_FILE_NOT_FOUND(参照:http://msdn.microsoft.com/en-us/library/ms681382%28v=3Dvs.%2085%29。 aspx

そして確かに、何らかの理由で、私が使用regeditしているものとこのコードスニペットで見ているものは一貫していません:

err_code, results = c.EnumKey (
    hDefKey=_winreg.HKEY_LOCAL_MACHINE,
    sSubKeyName="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
)
print err_code
for r in results:
    print result

私はこの振る舞いの適切な説明を探しています。

それが役に立てば幸い、

一番

編集

この投稿( http://mail.python.org/pipermail/python-win32/2009-February/008865.html )のおかげで、犯人を見つけたと思います。

したがって、Python APIを使用してキーを開く場合は、必要に応じてデータをフェッチできます。これがトリックを行うはずの小さな(醜い)コードです:

key = _winreg.OpenKey(
    _winreg.HKEY_LOCAL_MACHINE, 
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E5D76AD-A3FB-48D5-8400-8903B10317D3}" ,
     0,
    _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY

i = 0
while True:
    try:
        name, val, key_type = _winreg.EnumValue(key, i)
        if name == "DisplayName":
            print "%s => %s" % (name, val)
        except:
            # No more indices
            break
        i += 1

追加リファレンス: http: //msdn.microsoft.com/en-us/library/aa384129 (v = VS.85).aspx

編集2

コメントに続いて、これがあなたが望むことをするはずのコードスニペットです:

import _winreg

def getKeys(hKey, sSubKey):
    with _winreg.OpenKey(hKey, sSubKey, 0, _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY)     as key:
        idx = 0
        while True:
            try:
                yield _winreg.EnumKey(key, idx)
            except:
                # No more indices
                break
            idx += 1

hKey = _winreg.HKEY_LOCAL_MACHINE
sSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
for keyName in getKeys(hKey, sSubKey):
    with _winreg.OpenKey(hKey, "\\".join([sSubKey, keyName]) , 0, _winreg.KEY_READ |     _winreg.KEY_WOW64_64KEY) as key:
        i = 0
        while True:
            try:
                name, val, key_type = _winreg.EnumValue(key, i)
                if name == "DisplayName":
                    print "%s\\%s => %s" % (keyName, name, val)
                    break
            except:
                break

            i += 1
于 2013-02-05T11:12:24.473 に答える