Scanning through Windows registry...
Tim Golden
mail at timgolden.me.uk
Tue May 6 09:31:58 EDT 2008
Unknown Hero wrote:
> So basically I am looking for these things:
>
> 1) Read one subkey from HKEY_LOCAL_MACHINE at a time (I think
> QueryValueEx() is needed here)
> 2) Check if said subkey contains some predetermined string (like 'foo'
> here)
> 3) If the above applies, change the value into another predetermined
> string (like 'moo' here)
Well, I attach a kind of explanatory Noddy example I wrote a few years ago
for someone on the python-win32 list. I think, glancing over it, that it includes
what you need to know, although not necessarily in the right order. I'm happy to
explain if things aren't clear:
<code>
import _winreg
HKLM = _winreg.HKEY_LOCAL_MACHINE
#
# Set up a registry subtree under HKLM\Software
# which will look like this:
#
#
# TimSoft
# |
# +-- App1
# |
# +-- App2
# |
# +-- App3
#
#
# The [TimSoft] key has a default (ie unnamed) value
# while the Appx keys each have two values:
# [Registered] - a string Y/N value
# [Version] - a DWORD value
#
hSoftware = _winreg.OpenKey (HKLM, "Software")
hTimSoft = _winreg.CreateKey (hSoftware, "TimSoft")
_winreg.SetValueEx (hTimSoft, None, 0, _winreg.REG_SZ, "All Tim's Software")
hApp1 = _winreg.CreateKey (hTimSoft, "App1")
_winreg.SetValueEx (hApp1, "Version", 0, _winreg.REG_DWORD, 101)
_winreg.SetValueEx (hApp1, "Registered", 0, _winreg.REG_SZ, "Y")
hApp2 = _winreg.CreateKey (hTimSoft, "App2")
_winreg.SetValueEx (hApp2, "Version", 0, _winreg.REG_DWORD, 202)
_winreg.SetValueEx (hApp2, "Registered", 0, _winreg.REG_SZ, "N")
hApp3 = _winreg.CreateKey (hTimSoft, "App3")
_winreg.SetValueEx (hApp3, "Version", 0, _winreg.REG_DWORD, 303)
_winreg.SetValueEx (hApp3, "Registered", 0, _winreg.REG_SZ, "Y")
#
# NB - no need to do an explicit "write": the Registry uses
# some sort of caching which eventually catches up with itself,
# so unless you plan to turn the machine off soon, don't
# bother with FlushKey or anything like that.
#
#
# Now we start again, as though we were just querying
#
hTimSoft = _winreg.OpenKey (HKLM, r"Software\TimSoft")
n_sub_keys, n_values, last_modified = _winreg.QueryInfoKey (hTimSoft)
print n_sub_keys, "sub keys", n_values, "values", last_modified, "nanoseconds since 1600!"
#
# Pick up the default value: really should try to
# interpret the default_type to determine if it's
# a number or a string or whatever, but...
#
default_value, default_type = _winreg.QueryValueEx (hTimSoft, None)
print "Default value:", default_value
#
# Now, in this case I know (because I created them) that
# the TimSoft key has three subkeys, each of which has
# two values. But if I didn't...
#
print
for i in range (n_sub_keys):
subkey_name = _winreg.EnumKey (hTimSoft, i)
print subkey_name
#
# Alternatively, if I hadn't done the QueryInfoKey above...
#
i = 0
print
while 1:
try:
subkey_name = _winreg.EnumKey (hTimSoft, i)
except EnvironmentError:
break
else:
print subkey_name
i += 1
#
# Now, let's use the last key as an example
# and pick out its values.
#
print
print subkey_name
hAppKey = _winreg.OpenKey (hTimSoft, subkey_name)
i = 0
while 1:
try:
name, value, type = _winreg.EnumValue (hAppKey, i)
print name, value, type
except EnvironmentError:
break
else:
print " %s => %s (type %s)" % (name, value, type)
i += 1
</code>
TJG
More information about the Python-list
mailing list