1#!/usr/bin/python 2# 3# tool to manipulate a remote registry 4# Copyright Andrew Tridgell 2005 5# Copyright Jelmer Vernooij 2007 6# Released under the GNU GPL v3 or later 7# 8 9import sys 10 11# Find right directory when running from source tree 12sys.path.insert(0, "bin/python") 13 14from samba.dcerpc import winreg 15import optparse 16import samba.getopt as options 17 18parser = optparse.OptionParser("%s <BINDING> [path]" % sys.argv[0]) 19sambaopts = options.SambaOptions(parser) 20parser.add_option_group(sambaopts) 21parser.add_option("--createkey", type="string", metavar="KEYNAME", 22 help="create a key") 23 24opts, args = parser.parse_args() 25 26if len(args) < 1: 27 parser.print_usage() 28 sys.exit(-1) 29 30binding = args[0] 31 32print "Connecting to " + binding 33conn = winreg.winreg(binding, sambaopts.get_loadparm()) 34 35def list_values(key): 36 (num_values, max_valnamelen, max_valbufsize) = conn.QueryInfoKey(key, winreg.String())[4:8] 37 for i in range(num_values): 38 name = winreg.StringBuf() 39 name.size = max_valnamelen 40 (name, type, data, _, data_len) = conn.EnumValue(key, i, name, 0, "", max_valbufsize, 0) 41 print "\ttype=%-30s size=%4d '%s'" % type, len, name 42 if type in (winreg.REG_SZ, winreg.REG_EXPAND_SZ): 43 print "\t\t'%s'" % data 44# if (v.type == reg.REG_MULTI_SZ) { 45# for (j in v.value) { 46# printf("\t\t'%s'\n", v.value[j]) 47# } 48# } 49# if (v.type == reg.REG_DWORD || v.type == reg.REG_DWORD_BIG_ENDIAN) { 50# printf("\t\t0x%08x (%d)\n", v.value, v.value) 51# } 52# if (v.type == reg.REG_QWORD) { 53# printf("\t\t0x%llx (%lld)\n", v.value, v.value) 54# } 55 56def list_path(key, path): 57 count = 0 58 (num_subkeys, max_subkeylen, max_subkeysize) = conn.QueryInfoKey(key, winreg.String())[1:4] 59 for i in range(num_subkeys): 60 name = winreg.StringBuf() 61 name.size = max_subkeysize 62 keyclass = winreg.StringBuf() 63 keyclass.size = max_subkeysize 64 (name, _, _) = conn.EnumKey(key, i, name, keyclass=keyclass, last_changed_time=None)[0] 65 subkey = conn.OpenKey(key, name, 0, winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) 66 count += list_path(subkey, "%s\\%s" % (path, name)) 67 list_values(subkey) 68 return count 69 70if len(args) > 1: 71 root = args[1] 72else: 73 root = "HKLM" 74 75if opts.createkey: 76 reg.create_key("HKLM\\SOFTWARE", opt.createkey) 77else: 78 print "Listing registry tree '%s'" % root 79 try: 80 root_key = getattr(conn, "Open%s" % root)(None, winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) 81 except AttributeError: 82 print "Unknown root key name %s" % root 83 sys.exit(1) 84 count = list_path(root_key, root) 85 if count == 0: 86 print "No entries found" 87 sys.exit(1) 88