| 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 |
|
|---|
| 9 | import sys
|
|---|
| 10 |
|
|---|
| 11 | # Find right directory when running from source tree
|
|---|
| 12 | sys.path.insert(0, "bin/python")
|
|---|
| 13 |
|
|---|
| 14 | from samba.dcerpc import winreg
|
|---|
| 15 | import optparse
|
|---|
| 16 | import samba.getopt as options
|
|---|
| 17 |
|
|---|
| 18 | parser = optparse.OptionParser("%s <BINDING> [path]" % sys.argv[0])
|
|---|
| 19 | sambaopts = options.SambaOptions(parser)
|
|---|
| 20 | parser.add_option_group(sambaopts)
|
|---|
| 21 | parser.add_option("--createkey", type="string", metavar="KEYNAME",
|
|---|
| 22 | help="create a key")
|
|---|
| 23 |
|
|---|
| 24 | opts, args = parser.parse_args()
|
|---|
| 25 |
|
|---|
| 26 | if len(args) < 1:
|
|---|
| 27 | parser.print_usage()
|
|---|
| 28 | sys.exit(-1)
|
|---|
| 29 |
|
|---|
| 30 | binding = args[0]
|
|---|
| 31 |
|
|---|
| 32 | print "Connecting to " + binding
|
|---|
| 33 | conn = winreg.winreg(binding, sambaopts.get_loadparm())
|
|---|
| 34 |
|
|---|
| 35 | def 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 |
|
|---|
| 56 | def 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 |
|
|---|
| 70 | if len(args) > 1:
|
|---|
| 71 | root = args[1]
|
|---|
| 72 | else:
|
|---|
| 73 | root = "HKLM"
|
|---|
| 74 |
|
|---|
| 75 | if opts.createkey:
|
|---|
| 76 | reg.create_key("HKLM\\SOFTWARE", opt.createkey)
|
|---|
| 77 | else:
|
|---|
| 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)
|
|---|