1 | #!/usr/bin/env 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)
|
---|