我需要創建一個python腳本來瀏覽HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall的內容並返回每個鍵的DisplayName。Python,WMI,註冊表和奇怪的結果
我用這個作爲出發地(在另一個計算器後發現)
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
但是,如果我改變sSubKeyName和的sValueName(以有效值),這似乎是非常片狀,往往不是返回無。
例如:
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
這導致無被打印。
然而,
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
返回無
我試過原始字符串和逃離sl骨灰,都沒有工作。我也嘗試了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]
哇,謝謝。是否可以遍歷Uninstall鍵來查找所有子鍵的DisplayName?我查看了文檔(http://docs.python.org/2/library/_winreg.html),並找不到其他方法使用除了CreateKeyEx之外的標誌的方法。使用EnumKey將代碼提供給代碼看起來不起作用(文件未找到),我懷疑是因爲它從32位視圖中獲取值。 – mdj
請注意,這段代碼只是您可以做的一個例子。 特別是,我沒有找到比使用'try'''''更好的方法來遍歷鍵和值... –
真棒,我嘗試了幾種不同的方法,但無法使它工作。我將不得不花一些時間瞭解你的作品,謝謝! – mdj