簡體   English   中英

Python、WMI、注冊表和奇怪的結果

[英]Python, WMI, the registry, and strange results

我需要創建一個 python 腳本來遍歷HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall並返回每個鍵的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

但是,如果我更改sSubKeyNamesValueName (為有效值),它似乎非常sValueName ,經常返回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]

我查看了您的代碼並注意到當它失敗時,返回代碼為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM