• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src/router/samba-3.5.8/source4/scripting/python/examples/
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