我需要创建一个 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
但是,如果我将sSubKeyName
and 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]