[英]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
但是,如果我更改sSubKeyName
和sValueName
(为有效值),它似乎非常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
值较长而失败,但这只是一种直觉。
编辑
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.